Tôi đang sử dụng SQLiteOpenHelper để viết và đọc từ cơ sở dữ liệu SQlite trên Android. Khi người dùng nhấp vào UI tôi đọc từ cơ sở dữ liệu SQLite bằng cách sử dụng AsyncTask nhưng tại thời điểm samo chính xác tôi đang cập nhật và ghi vào cơ sở dữ liệu trong nền bằng cách sử dụng AsyncTask khác.Truy cập đa luồng SQlite Android
Mỗi lần x tôi nhận được ngoại lệ bị khóa cơ sở dữ liệu. Làm thế nào tôi có thể sửa lỗi này? Có thể truy cập SQlite bằng cách nào đó từ nhiều luồng cùng một lúc không?
Tôi đang sử dụng nó như thế: Tôi có một lớp Cơ sở dữ liệu mở rộng từ SQLiteOpenHelper. Tôi thực hiện onCreate và onUpgrade phương pháp và mọi Tôi đọc từ cơ sở dữ liệu hoặc văn bản cho cơ sở dữ liệu tôi sử dụng SQLiteDatabase như thế:
SQLiteDatabase database = null;
try {
database = new Database(context).getWritableDatabase();
....
writing and reading from database...
....
} catch (Exception e) {
e.printStackTrace();
} finally {
if (database != null) {
database.close();
}
}
Vào cuối Tôi cũng SQLiteStatements gần gũi và Cursors nếu tôi sử dụng chúng. Tôi có nên sử dụng câu trả lời @Justin và có một singleton của lớp cơ sở dữ liệu trong ứng dụng?
Đây là lỗi tôi nhận được:
E/SqliteDatabaseCpp(17377): sqlite3_open_v2("/data/data/com.skulptur/databases/LGM.s3db", &handle, 6, NULL) failed
E/SQLiteDatabase(17377): Failed to open the database. closing it.
E/SQLiteDatabase(17377): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
E/SQLiteDatabase(17377): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750)
E/SQLiteDatabase(17377): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:223)
Tôi nghĩ mọi thứ bạn có thể làm với thư viện android trên sqllite đều được đồng bộ hóa. Bạn không thể thử và bắt ngoại lệ và thử lại nếu bạn nhận được trạng thái khóa? – quinestor
Bạn có thể chỉnh sửa bài đăng của mình và đưa ra vài dòng đầu tiên của ngoại lệ và bất kỳ câu lệnh gây ra nào không? Tôi nghi ngờ điều này là ít hơn về những gì bạn đang làm và nhiều hơn nữa về tái sử dụng một cơ sở dữ liệu đóng cửa hoặc một cái gì đó. – Gray