错误:尝试重新查询已关闭的游标

时间:2012-06-23 16:23:05

标签: android cursor android-sqlite

我遇到了错误,但我似乎无法找到解决方案。我的应用程序正在使用ICS 4.0.3,但它在Android 3.2上返回错误。以下是我的MainActivity.java文件中的代码:

SQLiteDatabase db = databaseHelper.getReadableDatabase();
         Cursor cursor = db.query(DatabaseHelper.TABLE_NAME, new String[]{"_id","isim","icerik"}, null, null, null, null, null);
         startManagingCursor(cursor);
         tts=0;



         while(cursor.moveToNext()){
            if(tts==0)
             {            
            array_spinner=new String[cursor.getCount()+1];
            array_spinner[tts]= "FAVORİ";
             }
            array_spinner2[tts+1]= cursor.getString((cursor.getColumnIndex("isim")));
            array_spinner3[tts+1]= cursor.getString((cursor.getColumnIndex("icerik")));
             tts++;
            } 

         ss2 = (Spinner) findViewById(R.id.spinner2);
         ArrayAdapter<Object> adapter  = new ArrayAdapter<Object>(this,R.layout.row2, R.id.weekofday2, array_spinner2);
            ss2.setAdapter(adapter);
        } catch (Exception e) {}

有关如何解决此问题的任何建议?

3 个答案:

答案 0 :(得分:11)

某处,您正在关闭传递给Cursor的{​​{1}}。在关闭startManagingCursor()之前致电stopManagingCursor()

请注意,Cursor已弃用。当您的数据发生变化时,请在后台运行另一个查询(例如startManagingCursor()AsyncTask),而不是使用它。

此外,您可以考虑使用CursorLoader,例如CursorAdapter,而不是手动将所有数据转换为对象并使用SimpleCursorAdapter

另外,如果您要使用ArrayAdapter,请使用更具体的课程(例如ArrayAdapter,而非ArrayAdapter<String>)声明。

答案 1 :(得分:2)

说这可能对你有用:

    @Override
    protected void onRestart() {
        // TODO Auto-generated method stub
        super.onRestart();

        cursor.requery();
    }

答案 2 :(得分:1)

此错误似乎是由于不推荐使用已弃用的方法

造成的
startManagingCursor()

不能100%确定正确调用stopManagingCursor()会解决问题,因为它很偶然。

我建议避免使用它并坚持使用CursorLoader和LoaderManager。