我有一个SQLiteOpenHelper实现的静态单例实例。
public class MyDbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 5;
public static final String DATABASE_NAME = "myapp.db";
public static SQL_CREATE_MY_TABLE ="some correct table creation sql";
public static SQL_DELETE_MY_TABLE="some correct table delete sql";
...
public MyDbHelper (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_MY_TABLE);
db.execSQL(SQL_CREATE_OTHER_TABLE);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(SQL_DELETE_MY_TABLE);
db.execSQL(SQL_DELETE_OTHER_TABLE);
onCreate(db);
}
}
我在帮助器上有另一个包装器:
public class MyAppDb {
private static MyDbHelper mydbHelper;
public static MyDbHelper getDbHelper(){
if(null == mydbHelper){
mydbHelper= new MyDbHelper(ctx);
return mydbHelper;
}else{
return mydbHelper;
}
}
}
我在我的主要Ui代码(在不同的地方)使用来自此getDbHelper()的mydbHelper,以及每隔5分钟执行一次的Alarmmanager的BroadcastReceiver,以及在另一个系统BroadcastReceiver中使用。
样本用法:
SQLiteDatabase db = MyAppDb.getDbHelper().getReadableDatabase();
间歇性地,我从上面的mydbHelper获取了数据库实现的SQLiteDatabaseLockedException和SQLiteException。 好像虽然是静态的,但MyDbHelper有两个不同的实例同时出现。
发生了什么事?静态对象是否可以从BroadCastReceiver创建单独的实例?
或者我做错了?