2017-11-08 9 views
-1

私の活動ではAPIをリクエストしてデータを取得し、 SQLiteデータベース。次に、私はこのメソッドを呼び出します:Android - java.lang.IllegalStateException:既に閉じられているオブジェクトを再オープンしようとしました:SQLiteQuery:select * from table where rowid = 40495

public long getResultCount() { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    long cnt = DatabaseUtils.queryNumEntries(db, TABLE_NAME); 
    return cnt; 
} 

このメソッドは他のJavaクラスにあり、私のアクティビティで正しく動作します。このメソッドを呼び出した後、私は、メソッド呼び出し:

public ArrayList<Integer> getId(int i, int j) { 

    ArrayList<Integer> array_list = new ArrayList<Integer>(); 

    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("select * from " 
      + TABLE_NAME 
      + " limit " + i + "," + j 
      , null); 
    res.moveToFirst(); 

    while (!res.isAfterLast()) { 
     array_list.add(Integer.parseInt(res.getString(res.getColumnIndex(COLUMN_ID)))); 
     res.moveToNext(); 
    } 
    return array_list; 
} 

を、私はその後、このコードを書くとき:

temp = db.getId(min * 5, min * 5 + 5); 

for (int i = 0; i < temp.size(); i++) { 

     Cursor rs = db.getResult(temp.get(i)); 
     rs.moveToFirst(); 
     ... 
     rs.close(); 
    } 

エラーが発生します。

11月8日19:16:35.108 15365-15365 /? E/AndroidRuntime:致命的な例外:メイン プロセス:com.myapp.app、PID:15365 java.lang.IllegalStateException:既に閉じられたオブジェクトを再オープンしようとしました:SQLiteQuery:select * from table where rowId = 40495 at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.javaでandroid.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:58) でandroid.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) : (AbstractCursor.java:197) android.database.AbstractCursor.moveToFirst(Abstract )。com.myapp.app.MyFragment.populateListView(MyFragment.java:327) at com.myapp.app.MyFragment $ GetArticles.onPostExecute(MyFragment.java:693) at com.myapp。 app.MyFragment $ GetArticles.onPostExecute android.os.AsyncTask.finish(AsyncTask.java:636)で(MyFragment.java:497) アンドロイドでandroid.os.AsyncTask.access $ 500(AsyncTask.java:177) で.os.AsyncTask $ InternalHandler.handleMessage android.os.Looper.loop(Looper.java:135)でandroid.os.Handler.dispatchMessage(Handler.java:102)で(AsyncTask.java:653) アンドロイドで.app.ActivityThread.main(ActivityThread.java:5290) at java.lang.reflect.Method.invoke(ネイティブメソッド) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit .javaファイル:911) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706)で

のgetResult方法はこれです:

public Cursor getResult(int Id) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("select * from " + TABLE_NAME + " where " + COLUMN_ID + "=" + Id + "", null); 
    res.close(); 
    return res; 
} 
+0

あなたが投稿した最後のセグメントに例外がある場合、 'getID()'はクローズされたカーソルを返しています。あなたはそのコードを投稿しませんでした。 – laalto

+0

正確にはどういう意味ですか? –

+1

'getID()'コードを投稿してください。あなたが投稿した 'getid()'は違ったものです。 – laalto

答えて

0

お客様のgetResult()メソッドは、閉じたCursorを返します。あなたは何かのためにクローズドカーソルを使用することはできません。

どちらでもないclose()カーソルはgetResult()にあります。または、必要なデータをキャプチャする前にキャプチャし、カーソルではなくデータを返します。

0

あなたはreturn array_list;res.closeを忘れてしまいました

+0

メソッド** getId **にreturn array_listの前に** res.close()**を追加することを意味しますか?私はそれを試すが、そのエラーは再び発生した。 –

+0

はい、カーソルを閉じる必要があります – LordGrim

+0

これはstacktrace OPの解決策ではありません。 – laalto

0
for (int i = 0; i < temp.size(); i++) { 

     Cursor rs = db.getResult(temp.get(i)); 
     rs.moveToFirst(); 
     ... 
     rs.close(); 
    } 

カーソルを閉じる条件はありますか?そうでない場合 - カーソルは最初の反復の後で閉じられ、2番目のものでは例外が発生します。

関連する問題