0

我可以从我的活动中访问数据库功能,它工作正常。但是当我在广播接收器类中使用它时,它会失败并给我 cursor 的默认值,我的 logcat 显示:

从未在数据库 DatabaseObjectNotCloseException 上显式调用 close()

我也做过

db = context.openOrCreateDatabase("blitz.db", 0, null);    
dh=new DataHelper(context);

并将方法的上下文传递onReceiverDataHelperClass。它在这一行显示错误

OpenHelper openhelper=new OpenHelper(this.context);
this.db=openhelper.getWritableDatabase();

请让我知道我哪里出错了

4

4 回答 4

1

请记住,BroadcastReceiver 在主线程上运行,最长寿命为 10 秒,因此您不应该在onReceive(...).

相反,您应该启动一个服务以在工作线程上执行您长时间运行的工作。我建议看一下IntentService

于 2013-01-10T12:45:20.753 回答
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); 

或者您可以在单个方法(在您的数据库处理程序类中)中打开和关闭数据库

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);
 }

一般来说,如果你想打开之前已经打开的房子的窗户,那么你必须关闭它并再次打开它,如果你的数据库已经打开并且如果你想再次打开它,那么你有先关闭它。这样您就可以再次打开它。

于 2013-01-10T12:53:45.897 回答
0

覆盖OnStop()并关闭那里

@Override
public void OnStop()
{
   if(db!=null)
    {
     db.close();
     }
 }

它应该摆脱你的错误。

于 2013-01-10T13:05:22.950 回答
-1

广播接收器在不同的线程上监听不同的进程。要进行通信,您需要使用异步方法。我 android 最好的方法是注册一个处理程序并使用 bundle [in Intent] 进行通信。

于 2013-01-10T12:35:38.633 回答