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 (onCreate
và onUpgrade
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.
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
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
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