我的应用中的每个活动都有一些列表视图。对于每个getView(),我创建一个线程来打开一个Sqlite数据库并在(在每个线程中)之后关闭它。但是,我得到了数据库锁定错误。
注意:应用程序可以同时运行6个线程,每个线程都使用自己的SQLiteOpenHelper
因此,当Android表示在不需要时关闭数据库时,他是在谈论在应用程序处于后台时关闭还是在使用交易的每个请求时关闭?
代码:
public class TemporarySqliteDB extends SQLiteOpenHelper{
public TemporarySqliteDB(Context context) {
super(context, "Temporary", null, 1);
}
//..........
}
public class DaoImage{
private SQLiteDatabase writableDatabase;
public DaoImage(Context ctx) {
writableDatabase = new TemporarySqliteDB(ctx).getWritableDatabase();
}
public void close() {
writableDatabase.close();
}
}
在我的主题run()
中//this give locked error while instanciating
DaoImage daoImage = null;
try {
daoImage = new DaoImage(ctx.get());
//.....
}finally {
if(daoImage != null)
daoImage.close();
}
//This without error
DaoImage daoImage = new DaoImage(ctx.get());
//....
在不关闭数据库的情况下,我看到内存使用正常。但我不知道最好让数据库保持打开状态。
答案 0 :(得分:1)
要获得Android的SQLite线程安全性,您需要使用SQliteOpenHelper
类的相同实例。一旦你这样做,每次使用后关闭数据库都是正确的,SQliteOpenHelper
负责并发。
通过让你的助手成为单身人士的一个例子:
public class TemporarySqliteDB extends SQLiteOpenHelper {
private static TemporarySqliteDB instance;
@synchronized public static getInstance(Context context) {
if (instance == null) {
instance = new TemporarySqliteDB(context.getApplicationContext());
}
return instance;
}
// rest of class here
}
然后是
之类的东西SQLiteDatabase db = TemporarySqliteDB.getInstance().getWriteableDatabase();
try {
// use db
} finally {
db.close();
}
当前的使用模式发生的是,而不是获得SQLiteOpenHelper
的线程安全性,而是在sqlite文件本身上使用SQLite的并发安全保护,它试图防止使用并发访问来破坏数据库来自不同的流程。