你能指出这段代码的错误之处吗?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) {
}
}
}发布于 2012-05-23 17:00:31
首先打开数据库,然后在插入后关闭数据库,然后再次打开以读取值。
首先,你不需要关闭和打开它,again.You可以做你所有的操作,并且可以关闭它,因为你仍然在相同的代码块中。
使用genresCursor完成操作后,使用genresCursor.close()关闭它,然后关闭您的db.Hopefully。
发布于 2012-05-23 19:20:34
我不明白你为什么要插入这段代码:
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()。但从架构的角度来看,我不明白您为什么需要这些代码。
发布于 2014-06-04 01:49:42
使用游标和数据库的最佳实践是,您应该在同一代码块中打开和关闭它。当我使用在数据库中插入行时,我使用在开始时打开它,然后在返回之前插入许多列并关闭它。
在Honeycomb之前的API中,你不会得到任何关于未关闭光标的日志消息和性能问题,但是Honeycomb之前的API有一个cursor not closed检测器,它将记录关于光标未关闭的消息。
编辑:在相同的代码块中关闭数据库。根据场景可以关闭光标,但在删除上下文之前必须关闭光标。
https://stackoverflow.com/questions/10716605
复制相似问题