数据库未封闭的游标。插入方法后关闭它

时间:2012-05-23 08:53:49

标签: android database

你介意指出这种代码的和平有什么问题吗? 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) {

        }

    }

}

3 个答案:

答案 0 :(得分:0)

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

首先你不需要关闭并再次打开它。你可以完成所有的操作,并且可以关闭它,因为你仍然在相同的代码块中。

使用genresCursor完成操作后,通过genresCursor.close()关闭它,然后关闭db.Hopefully就可以了。

答案 1 :(得分: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()。但从架构的角度来看,我不明白你为什么需要这个代码。

答案 2 :(得分:0)

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

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

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