【问题标题】:How to solve this exception?如何解决这个异常?
【发布时间】:2011-09-01 18:28:06
【问题描述】:

我一直收到这个异常,DatabaseObjectNotClosedException:

close() was never explicitly called on database '/data/data/com.project.test/databases/database' 
E/SQLiteDatabase(13921): android.database.sqlite.DatabaseObjectNotClosedException:        
Application did not close the cursor or database object that was opened here

我尝试关闭数据库助手和游标,但我会得到运行时异常。当我离开活动并在点击后退按钮后重新访问它时会发生这种情况。

如何正确关闭我的游标和助手?

我尝试了两种方法:

首先,在每次单独使用后关闭游标,然后关闭数据库助手 onpause。

其次,关闭游标onpause以及databasehelper,但两者都不起作用。

有人可以帮我解决这个问题吗?

编辑:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    activity = this.getActivity();
    context = this.getActivity().getApplicationContext();
    layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mDbHelper = new DatabaseHelper(context);
    mDbHelper.open();
    populateList();
}

public void populateList() {
    directoryCursor = mDbHelper.fetchAllRootDirectories();
    activity.startManagingCursor(directoryCursor);

    adapter = new DirectoryListAdapter(this.getActivity(), directoryCursor);
    this.setListAdapter(adapter);
}

                 ......


private UpdateDatabaseListener updateDatabaseListener = new UpdateDatabaseListener() {

    public void onUpdate(int from, int to) {

                .....

        findExistingRecordCursor = mDbHelper.findExistingRecords(from, to);
        activity.startManagingCursor(findExistingRecordCursor);
        if(findExistingRecordCursor.getCount() == 0) {

              ....

          }

  }
}

我在 onCreate() 函数中打开了一个数据库助手。 填充列表视图时使用的游标, 用于查找现有记录的游标, 光标来获取信息。


更新:

我已尝试关闭 onPause 和 onDestroy,但它仍然会因运行时异常而崩溃。

【问题讨论】:

  • 能否请您发布您的代码
  • @Gaurav 您实际上需要查看代码的哪一部分?因为它真的有很多代码。我可以看到我可以粘贴的内容。
  • @Gaurav 我已经写下了我使用数据库助手和游标的地方
  • @Gaurav 我也从我的活动中添加了一些代码。

标签: java android database sqlite exception


【解决方案1】:

您是否正在关闭 SQLiteDatabase 对象。如果不尝试像这样关闭 SQLiteDatabase 对象

  1. SQLiteDatabase db = SQLiteHelper classobject.getWriteableDatabase();

  2. // 代码块

  3. db.close();

并运行您的应用程序。

能否请您发布您的代码,以便更有助于理解您的问题。

【讨论】:

  • 感谢您的回复,我已在问题中添加了一些信息。我尝试在 onPause() 方法上关闭光标。当我离开进行另一项活动并点击后退按钮时。它抛出了一个运行时异常。
  • 如果我不关闭,那么除了 DatabaseObjectNotClosedException 之外它不会有任何问题。
  • 尝试将您的数据库助手转移到扩展 SQLiteOpenHelper 的新活动,然后在您的主活动类中实例化 SQLiteHelper。这是我的想法,但我不确定它是否会起作用。
【解决方案2】:

抱歉回复晚了。 据我所知,您已经使用 mDbHelpher.open() 之后你做了 populatelist() 之后你有没有尝试做 mDbHelpher.close() ?

光标也一样。因为您的错误清楚地表明数据库或游标处于打开状态。 一旦你使用完数据库,你应该关闭。即使您访问另一个活动然后按返回按钮,这也不应该出现问题。

您还说关闭数据库或游标时会出现运行时异常。是同一个例外还是不同?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2012-01-08
    相关资源
    最近更新 更多