2013-07-24 35 views
13

Tôi đang tạo một ứng dụng tạo nhiều tương tác với cơ sở dữ liệu (cả hoạt động đọc và ghi).Mở/đóng đúng cơ sở dữ liệu bằng mẫu thiết kế Singleton

Để tránh các hoạt động mở/đóng tại mỗi yêu cầu, tôi đã tạo một lớp mở rộng SQLiteOpenHelper bằng mẫu thiết kế Singleton. Bằng cách này, tôi chắc chắn chỉ có một phiên bản của SQLiteOpenHelper và chỉ một kết nối đến cơ sở dữ liệu được thực hiện trong tất cả các ứng dụng vòng đời (và không chỉ hoạt động vòng đời).

Tôi cũng đọc một số bài viết về ContentProvider, nhưng tôi không chắc đó là cách tốt hơn.

Vì vậy, đây là logic chính của lớp Singleton của tôi (onCreateonUpgrade loại bỏ):

public final class BaseSQLite extends SQLiteOpenHelper { 

    private static BaseSQLite mInstance = null; 

    private SQLiteDatabase db = null; 

    public static BaseSQLite getInstance(Context context) { 
     if (mInstance == null) { 
      mInstance = new BaseSQLite(context.getApplicationContext(), 
        DBNAME, DBVERSION); 
     } 
     return mInstance; 
    } 

    private BaseSQLite(final Context context, final String name, 
      final int version) { 
     super(context, name, null, version); 
     db = getWritableDatabase(); 
    } 

    @Override 
    public synchronized void close() { 
     if (mInstance != null) 
      db.close(); 
    } 

    public Cursor getAllData() { 
     String buildSQL = "SELECT * FROM myTable"; 

     return db.rawQuery(buildSQL, null); 
    } 

} 

Vì vậy, để truy cập vào cơ sở dữ liệu của tôi, tôi đã thực hiện điều này:

BaseSQLite baseSQLite = BaseSQLite.getInstance(context); 
baseSQLite.getAllData(); 

Nó hoạt động hoàn hảo ngay bây giờ. Nhưng câu hỏi của tôi là về phương pháp close(). Tôi thực sự không biết khi nào nên gọi nó. Trên thực tế, instance cơ sở dữ liệu của tôi giống nhau đối với mọi Activies của ứng dụng, vì vậy tôi nghĩ rằng nên gọi close() trong phương thức onPause(), vì cá thể sẽ có khả năng (và nó thường sẽ xảy ra) được tái tạo theo phương thức onStart() Hoạt động tiếp theo. Ngoài ra, tôi không thể phát hiện end ứng dụng của mình, tức là khi không còn hoạt động nào hiển thị trên màn hình nữa.

Ai đó có thể cho tôi một số trợ giúp về vấn đề này không? Tôi tìm thấy một số câu trả lời khi cơ sở dữ liệu được liên kết với hoạt động ONE, nhưng không có gợi ý thực sự nào được đưa ra cho trường hợp của tôi.

Trả lời

0

Bạn nên gọi gần bất cứ lúc nào bạn đã hoàn thành việc ghi vào cơ sở dữ liệu của mình. Ví dụ khi bạn chèn dữ liệu, bạn sẽ có một kết nối mở với cơ sở dữ liệu sẽ được đóng khi nó được thực hiện.

Đọc khác. Khi bạn tạo một cơ sở dữ liệu SQLite trên điện thoại của mình, dữ liệu sẽ liên tục. Cơ sở dữ liệu tồn tại và trình xử lý bạn tạo cung cấp một cách thuận tiện để truy cập thông tin đó. Việc đọc cơ sở dữ liệu thường diễn ra bằng cách lấy một thể hiện có thể đọc được của cơ sở dữ liệu và sử dụng một Cursor để trích xuất các giá trị. Trong trường hợp đó bạn đóng con trỏ khi bạn hoàn thành, không phải là cơ sở dữ liệu.

Bạn nói đúng là bạn không nên đóng kết nối cơ sở dữ liệu trong các phương pháp vòng đời của các hoạt động riêng biệt. Thay vào đó, như đã đề xuất ở trên, hãy đóng kết nối cơ sở dữ liệu trong các phương thức của trình xử lý ghi vào cơ sở dữ liệu khi bạn thực hiện xong giao dịch đó.

+0

Ok, vì vậy tôi phải xóa dòng 'db = getWritableDatabase()' và thêm vào mỗi phương thức 'getWritableDatabase()' hoặc 'getReadableDatabase()'. Sau đó, trong phương thức viết, ví dụ như 'updateEntry (Object)', tôi nên tạo một cái gì đó như: 'getWritableDatabase(); db.rawQuery (myRequestString, null); db.close() '? – mithrop

+0

nếu myRequestString là một chỉ số chèn - có. [xem ví dụ này] (http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/) Tôi không đề xuất bạn sao chép chính xác nhưng bạn có thể xem cách hoạt động của giao dịch trong giao dịch. Cách tôi làm điều đó là có một phương thức trong lớp xử lý db thực hiện từng chức năng ghi - ví dụ: thêm mục nhập vào bảng. Khi bắt đầu phương thức đó, tôi nhận được một cá thể db có thể ghi và khi giao dịch được thực hiện, tôi đóng nó ở cuối phương thức. – Rarw

+0

Ok. Nó có vẻ là một lựa chọn thực sự tốt.Tôi lo lắng về các buổi biểu diễn thực hiện nhiều cuộc gọi mở/đóng, nhưng dường như nó không thực sự là vấn đề :) – mithrop