2011-12-16 7 views
9

私はCursorを使ってデータベースからレコードを取り出しました。それは完璧な仕事です。カーソルとデータベースを安全に閉じるにはどうすればよいですか?

12-16 14:49:20.774: E/Database(18611): close() was never explicitly called on database '/data/data/com.android.application/databases/appZ.db' 
12-16 14:49:20.774: E/Database(18611): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844) 
12-16 14:49:20.774: E/Database(18611): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540) 
12-16 14:49:20.774: E/Database(18611): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158) 
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.DBHelper.fetchAll(DBHelper.java:91) 
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.ApplicationActivity.sc_adapter(ApplicationActivity.java:1210) 
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.ApplicationActivity.refresh_data(ApplicationActivity.java:1195) 
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.ApplicationActivity.onKeyDown(ApplicationActivity.java:1440) 
12-16 14:49:20.774: E/Database(18611): at android.view.KeyEvent.dispatch(KeyEvent.java:1037) 
12-16 14:49:20.774: E/Database(18611): at android.app.Activity.dispatchKeyEvent(Activity.java:2068) 
12-16 14:49:20.774: E/Database(18611): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1643) 
12-16 14:49:20.774: E/Database(18611): at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471) 
12-16 14:49:20.774: E/Database(18611): at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441) 
12-16 14:49:20.774: E/Database(18611): at android.view.ViewRoot.handleMessage(ViewRoot.java:1735) 
12-16 14:49:20.774: E/Database(18611): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-16 14:49:20.774: E/Database(18611): at android.os.Looper.loop(Looper.java:123) 
12-16 14:49:20.774: E/Database(18611): at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-16 14:49:20.774: E/Database(18611): at java.lang.reflect.Method.invokeNative(Native Method) 
12-16 14:49:20.774: E/Database(18611): at java.lang.reflect.Method.invoke(Method.java:521) 
12-16 14:49:20.774: E/Database(18611): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-16 14:49:20.774: E/Database(18611): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-16 14:49:20.774: E/Database(18611): at dalvik.system.NativeStart.main(Native Method) 

は私がhereから何かを参照さ - 私は

public Cursor fetchAll() 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.query(t1, new String[] {"_id",name, date, prior, time, dateformat}, null, null, null, null, prior); 
    return cursor; 
} 

マイlogcatは、このコードを使用していながら、しかし、私はLogcatに多少の誤差をしました。彼らは、getReadableDatabase()を使用すると言った。私はその方法も使用しています。私は私のデータベースにこのエラーをしましたまた、後

Database wasn't open. 

- そして、私はまたのようなもの持っエラーが発生した後、この方法で、

public Cursor fetchAll() 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.query(t1, new String[] {"_id",name, date, prior, time, dateformat}, null, null, null, null, prior); 
    if (cursor!=null) 
    { 
     cursor.close(); 
    } 
    if (db!=null) 
    { 
     db.close(); 
    } 
    return cursor; 
} 

を使用してきました。誰も私に教えてくださいどのようにレコードを取得した後、カーソルとデータベースの安全性を取得しますか?

答えて

9

EDIT:既に閉じているカーソルを返すと、そのカーソルは使用できません。メソッドを呼び出す前にデータベースを開き、メソッドを呼び出した後でカーソルを閉じてからデータベースを閉じます。

あなたはこのようにそれで終わった後、あなたは、カーソルをクローズすることができます

Cursor cursor = fetchAll(); 
... // Do your work with the cursor 
cursor.close(); 

それとも、活動からカーソルを使用して、アクティビティを再起動したとき(再クエリする必要があるしている場合は、停止)カーソルを閉じた後、または好ましくはonDestroy()における活動内部場合(データベースを閉じるには

Cursor cursor = fetchAll(); 
startManagingCursor(cursor); // Android will take care of the cursor for you 
// Do your work with the cursor 

:...)あなたはこれを使用することができ

dbhelper.close(); 
1

answer(アクティビティの状態に応じてカーソル/ dbオブジェクトの接続をどこで終了するかを示唆)またはthis one(SQLiteDatabaseオブジェクトのクローズ方法を示唆)を参照することもできます。それが既に一度書かれた時を詳述する必要はありません。それにもかかわらず、以下はコーディング部分のアイデアです。

+2

これは、カーソルではなく、データベースを閉じます。 –

+0

ええ - あなたは質問の最後の部分を読んだことがありますか?引用するには:だれでも私に教えてくださいどのようにレコードを取得した後、カーソルとデータベースの安全性を取得します。 – hovanessyan

1

このメソッドを呼び出すたびに、データベースは読み取りモードで開きますが、このエラーが発生するのはデータベースを閉じなかったためです。あなたが行をフェッチした後、カーソルを閉じることができながら、カーソルのためのこれ以上の必要性を閉じますと

2

より良い練習をnullに設定があるときに一度だけのonCreate()メソッドからのように開き、破壊で閉じます()

onResume()で開き、onPause()で閉じます。

+2

docs/examplesへの参照はありますか? – Mixaz

3

ContentProviderを拡張するクラスで、データベース接続 を開き、onCreateでインスタンス変数としてヘルパーを設定すると、シャットダウン時に データベース接続を閉じることができます。

@Override 
public boolean onCreate() { 
    mOpenHelper = getDBOpenHelper(); 
    return true; 
} 
@Override 
public void shutdown() { 
mOpenHelper.close(); 
    super.shutdown(); 
} 
0

あなたはfetchAllメソッドのパラメータとしてSQLiteDatabaseを渡して試してみてください。

MyDatabase db = new MyDatabase(this); 

.... 

Cursor myCursor = db.fetchAll(db.getReadableDatabase()); 

myCursor.close(); 
db.close(); 




    public Cursor fetchAll(SQLiteDatabase db, String listName) { 
     String sql = "select ID _id, Name from ListName where Name = ? order by ID"; 
     Cursor c = db.rawQuery(sql, new String[] { listName }); 
     c.moveToFirst(); 

     return c; 
    } 
関連する問題