我可以从我的Activity访问数据库功能,它工作正常。但是当我在广播接收器类中使用它时它失败并给我默认的游标值,而我的logcat显示了这个:
从未在数据库上显式调用close() DatabaseObjectNotCloseException
我也做过
db = context.openOrCreateDatabase("blitz.db", 0, null);
dh=new DataHelper(context);
并将onReceiver
方法的上下文传递给DataHelper
类。
它在此行显示错误
OpenHelper openhelper=new OpenHelper(this.context);
this.db=openhelper.getWritableDatabase();
请告诉我出错的地方
答案 0 :(得分:1)
请记住,BroadcastReceiver在主线程上运行,和的最长生命周期为10秒,因此您不应该在onReceive(...)
中长时间运行。
相反,您应该启动一个服务来在工作线程上执行长时间运行的工作。我建议查看IntentService
。
答案 1 :(得分:0)
在完成数据库工作后始终关闭数据库,
为简单起见,在databaseHandler类中创建以下方法,
public void Open_DB(SQLiteDatabase db){
return this.getWritableDatabase();
}
public void Close_DB(SQLiteDatabase db){
db.close();
}
并在您的活动或服务中使用此方法,
OpenHelper openhelper=new OpenHelper(getApplicationContext());
SQLiteDatabase db=openhelper.Open_DB(db)
openhelper.some_Operation(db);
db.Close_DB(db);
或者您可以在单个mehod(在数据库处理程序类中)打开和关闭数据库
public void deleteRecord(String id) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_REMINDER, REMINDER_ID + " = ?",
new String[] { String.valueOf(id)});
db.close();
}
并从您的活动中调用此方法,
public void Delete_A_Reminder(String id){
DatabaseHandler mydb=new DatabaseHandler1(getApplicationContext());
mydb.deleteRcord(id);
}
一般情况下,如果您想打开已经打开的房子窗口,那么您必须关闭它并再次打开它,如果您的数据库已经打开并且想要再次打开它然后你必须先关闭它。然后你可以再次打开它。
答案 2 :(得分:0)
覆盖OnStop()
并关闭
@Override
public void OnStop()
{
if(db!=null)
{
db.close();
}
}
它应该摆脱你的错误。
答案 3 :(得分:-1)
广播接收器正在侦听到不同进程的不同线程。要进行通信,您需要使用异步方法。我最好的是注册一个处理程序并使用[在Intent]中的bundle来进行交流。