2013-09-03 94 views
6

Tôi có một câu hỏi newbie về cơ sở dữ liệu SQLite trong Android:Tôi có cần phải gọi getWritableDatabase() mỗi khi thao tác dữ liệu

Tôi có thực sự cần phải lấy một cơ sở dữ liệu có khả năng ghi mọi Tôi thao tác dữ liệu?

Vì vậy, tôi có thể viết một DAO như thế này:

class Dao { 

     private final SQLiteDatabase database; 

     public Dao(SQLiteOpenHelper databaseHelper){ 

      database = databaseHelper.getWritableDatabase(); 
    } 

    public void insert(...){ 

     ContentValues cv = new ContentValues(4); 
     database.insertOrThrow(TABLE, null, cv); 
     ... 
    } 


    public void update(...){ 
     ContentValues cv = new ContentValues(4); 
     database.update(....); 
    } 
} 

hay tôi phải viết dao của tôi như thế này:

class Dao { 

     private final SQLiteOpenHelper databaseHelper; 

     public Dao(SQLiteOpenHelper databaseHelper){ 

      this.databaseHelper = databaseHelper 
    } 

    public void insert(...){ 

     SQLiteDatabase database = databaseHelper.getWritableDatabase(); 
     ContentValues cv = new ContentValues(4); 
     database.insertOrThrow(TABLE, null, cv); 
     ... 
    } 


    public void update(...){ 
     SQLiteDatabase database = databaseHelper.getWritableDatabase(); 
     ContentValues cv = new ContentValues(4); 
     database.update(....); 
    } 
} 

Nếu cách tiếp cận thứ hai là đúng nhất: làm tôi cũng cần phải đóng cơ sở dữ liệu sau mỗi hoạt động:

public void update(...){ 
    SQLiteDatabase database = databaseHelper.getWritableDatabase(); 
    ContentValues cv = new ContentValues(4); 
    database.update(....); 
    database.close(); 
} 

Tôi đoán tương tự cho databaseHelper.getReadableDatabase() phải không?

Trả lời

9

Bạn nên đóng mọi con trỏ bạn mở. Nhưng cá thể cơ sở dữ liệu không cần phải đóng sau mỗi lần sử dụng.

Tôi thường tìm nạp cơ sở dữ liệu có thể ghi trong onCreate() và lưu trữ kết quả SQLiteDatabase làm biến thành viên cho từng hoạt động và không bao giờ đóng rõ ràng trường hợp đó. (Nhưng một lần nữa, tôi đóng mọi con trỏ ngay sau khi tôi xử lý xong kết quả của chúng.)

Xem Managing SQLite Connections in Android để thảo luận thêm về chủ đề này.

+1

Tôi không muốn làm điều đó trong mọi Hoạt động. Vì vậy, tôi sẽ phân lớp ứng dụng và thực hiện ở đó một cái gì đó như một singleton, để đảm bảo rằng Dao (cụ thể hơn SQLiteOpenHelper) được instantiated chỉ một lần – sockeqwe

+0

@sockeqwe: Bạn _could_ đặt nó trong ứng dụng của bạn như là một tĩnh, nhưng đó thường được coi là thực hành xấu . Nó cũng sẽ làm cho các hoạt động thử nghiệm khó khăn hơn. Nhưng nếu bạn không quan tâm đến thực hành tốt hay thử nghiệm mã chính thức, thì vâng, điều đó có thể hoạt động. Chỉ cần đảm bảo rằng mã của bạn không bao giờ đóng kết nối; nếu không nó sẽ không được rõ ràng lý do tại sao một số hoạt động không nhận được một kết nối liên tục. (Đó là một trong những lý do tại sao nó thực hành xấu.) –