1

你介意指出这种和平的代码有什么问题吗?GenresCursor 包含“应用程序没有关闭在此处打开的游标或数据库对象”异常。插入后如何真正关闭此光标?谢谢。

UPD:似乎根本没有问题。即使它包含仍然可以提取数据的异常。我在实际应用中一定是错的,这个例外让我得出结论,这就是问题所在。感谢大家的参与。

public class DatabaseCursorActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        HashMap<Integer, String> _dummy = new HashMap<Integer, String>();

        OpenDatabaseHelper helper = new OpenDatabaseHelper(this);
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(OpenDatabaseHelper.GENRES_ID_KEY, 1);
        values.put(OpenDatabaseHelper.GENRES_TITLE_KEY, "Test");
        db.insert(OpenDatabaseHelper.GENRES_TABLE_NAME, null, values);
        db.close();
        helper.close();

        db = helper.getReadableDatabase();
        Cursor genresCursor = db.query(OpenDatabaseHelper.GENRES_TABLE_NAME, new String[]{OpenDatabaseHelper.GENRES_ID_KEY, OpenDatabaseHelper.GENRES_TITLE_KEY }, null, null, null, null, null);
        int i = genresCursor.getColumnCount();
        genresCursor.moveToFirst();
    }

    public class OpenDatabaseHelper extends SQLiteOpenHelper {

        public static final String GENRES_TABLE_NAME = "genres";
        public static final String GENRES_ID_KEY = "id";
        public static final String GENRES_TITLE_KEY = "title";

        public OpenDatabaseHelper(Context context) {
            super(context, "ttt.db", null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + GENRES_TABLE_NAME + "( id integer primary key not null, title text);" );
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }

    }

}
4

3 回答 3

0

使用游标和数据库的最佳实践是您应该在同一个代码块中打开和关闭它。当我用于将行插入数据库时​​,我会在开始时打开它,然后插入许多列并在返回之前将其关闭。

在 Honeycomb 之前的 API 中,您不会收到有关未关闭游标的任何日志消息和性能问题,但 Honeycomb 之前的 API 有一个 Cursor not closed 检测器,它将记录有关游标未关闭的消息。

编辑:在同一代码块中关闭数据库。光标可以根据场景关闭,但必须在上下文删除之前关闭。

于 2014-06-03T17:49:42.437 回答
0

您首先打开数据库,插入后关闭数据库,然后再次打开以读取值。

首先,您不需要关闭并再次打开它。您可以执行所有操作,并且可以关闭它,因为您仍在同一代码块中。

使用您的genresCursor 完成操作后,通过genresCursor.close() 关闭它,然后关闭您的db。希望它会没事。

于 2012-05-23T09:00:31.220 回答
0

我不明白您为什么插入此代码:

db = helper.getReadableDatabase();
Cursor genresCursor = db.query(OpenDatabaseHelper.GENRES_TABLE_NAME, new String[]{OpenDatabaseHelper.GENRES_ID_KEY, OpenDatabaseHelper.GENRES_TITLE_KEY }, null, null, null, null, null);
int i = genresCursor.getColumnCount();
genresCursor.moveToFirst();

问题出在这部分代码中。如果您只想关闭光标,请调用genresCursor.close(). 但从架构的角度来看,我不明白你为什么需要这段代码。

于 2012-05-23T11:20:34.223 回答