首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库未关闭的游标。在insert方法之后关闭它

问数据库未关闭的游标。在insert方法之后关闭它
EN

Stack Overflow用户
提问于 2012-05-23 16:53:49
回答 3查看 734关注 0票数 1

你能指出这段代码的错误之处吗?genresCursor包含“应用程序未关闭此处打开的游标或数据库对象”异常。如何在插入后真正关闭此光标?谢谢。

UPD:看起来一点问题都没有。即使它包含异常,仍然可以提取数据。我一定是在实际应用中弄错了,这个异常让我得出结论,这就是问题所在。感谢大家的参与。

代码语言:javascript
复制
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) {

        }

    }

}
EN

回答 3

Stack Overflow用户

发布于 2012-05-23 17:00:31

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

首先,你不需要关闭和打开它,again.You可以做你所有的操作,并且可以关闭它,因为你仍然在相同的代码块中。

使用genresCursor完成操作后,使用genresCursor.close()关闭它,然后关闭您的db.Hopefully。

票数 0
EN

Stack Overflow用户

发布于 2012-05-23 19:20:34

我不明白你为什么要插入这段代码:

代码语言:javascript
复制
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()。但从架构的角度来看,我不明白您为什么需要这些代码。

票数 0
EN

Stack Overflow用户

发布于 2014-06-04 01:49:42

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10716605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档