0

アクティビティからデータベース機能にアクセスでき、正常に動作します。しかし、ブロードキャストレシーバークラスで同じものを使用すると、失敗し、カーソルのデフォルト値が表示されます.logcatはこれを示しています:

データベース DatabaseObjectNotCloseException で close() が明示的に呼び出されたことはありません

私もやった

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

onReceiverメソッドのコンテキストをDataHelperクラスに渡しました。この行にエラーが表示されます

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

どこが間違っているのか教えてください

4

4 に答える 4

1

BroadcastReceiver はメイン スレッドで実行され、最大寿命は 10 秒であることを覚えておいくださいonReceive(...)

代わりに、Service を起動して、長時間実行される作業をワーカー スレッドで実行する必要があります。をご覧になることをお勧めしIntentServiceます。

于 2013-01-10T12:45:20.753 に答える
0

オーバーライドOnStop()してそこで閉じます

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

それはあなたのエラーを取り除くはずです。

于 2013-01-10T13:05:22.950 に答える
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 に答える
-1

ブロードキャスト レシーバは、別のスレッドで別のプロセスをリッスンしています。通信するには、非同期メソッドを使用する必要があります。私は、ハンドラーを登録し、[インテントで]バンドルを使用して通信するのが最善のアンドロイドです。

于 2013-01-10T12:35:38.633 に答える