【发布时间】:2014-09-10 18:34:33
【问题描述】:
我正在使用带有SQLiteAssetHelper 2.0.1 的 SQLite。我实现了一个单例 DBHelper 子类,例如:
public class DBHelper extends SQLiteAssetHelper {
private static final String DB_NAME = "...";
private static final int DB_VERSION = 1;
private static final String DB_STORAGE_DIR = "...";
private static SQLiteDatabase db = null;
private static DBHelper instance;
// Create the db storage directory if it does not exist
static {
File dir = new File(DB_STORAGE_DIR);
if (!dir.exists()) {
if (!dir.mkdirs()) {
Log.e("BEEP", "Create database folder failed! BANG!");
}
}
}
public static DBHelper getInstance(Context context){
if(instance == null){
instance = new DBHelper(context);
}
return instance;
// return new DBHelper(context);
}
private DBHelper(Context context) {
super(context, DB_NAME, DB_STORAGE_DIR, null, DB_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onUpgrade(db, oldVersion, newVersion);
}
public Cursor rawQuery(String query, String[] arguments){
if(db == null || !db.isOpen()) {
db = getReadableDatabase();
}
return db.rawQuery(query, arguments);
}
public void execute(String sql, Object[] arguments){
if(db == null || db.isReadOnly()) {
db = getWritableDatabase();
}
db.execSQL(sql, arguments);
}
public void close(){
if(db != null && db.isOpen()){
db.close();
}
}
}
我得到了 DBHelper 实例的两个引用,比如说 readInstance 和 writeInstance 具有相同的上下文,我运行了一些类似的 sql:
writeInstance.read(...);
for (int i = 0; i < n; i++) {
readInstance.read(...);
writeInstance.write(...); //IllegalStateException
}
然后我在 DBHelper.execute 方法中的 write 方法中得到 IllegalStateException。 我尝试在execute方法中同步db:
public void execute(String sql, Object[] arguments){
if(db == null || db.isReadOnly()) {
db = getWritableDatabase();
}
synchronized (db){
db.execSQL(sql, arguments);
}
}
但仍然出现错误。 任何建议都会有所帮助,谢谢!
【问题讨论】:
-
你在任何地方调用方法 DBHelper::instance().close() 吗?