无法从广播接收器类android访问数据库

时间:2013-01-10 12:22:25

标签: android database broadcast

我可以从我的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();

请告诉我出错的地方

4 个答案:

答案 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来进行交流。