如何在Android中正确打开/closuresSQLite数据库

我有一个应用程序function正常,不强制closures或崩溃。 但是当我看着LogCat时,它偶尔会给我这个:

05-20 15:24:55.338: E/SQLiteDatabase(12707): close() was never explicitly called on database '/data/data/com.---.--/databases/debt.db' 05-20 15:24:55.338: E/SQLiteDatabase(12707): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 

一点点的方法…

 05-20 15:24:55.338: E/System(12707): Uncaught exception thrown by finalizer 05-20 15:24:55.338: E/System(12707): java.lang.IllegalStateException: Don't have database lock! 

我不知道什么时候应该打开和closures我的数据库

我有一个简单的主屏幕的主要活动。 然后进入一个使用来自DB的信息调用ListView的活动; 所以在这个活动中,DB首先打开。

另外还有一个Activity,其中需要使用ListVeew分支的数据库。 我应该什么时候打开和closures这个? Word似乎只需要打开一次,然后在应用程序“暂停”,“停止”或“销毁”时closures。

如果是这种情况,我应该在哪里放置db.close()方法…在启动屏幕主要活动,其中onStop等位于? 或者是与打开数据库的活动相同的活动? 还是..还有另一个地方?

更新:

这是错误一直指向的代码行:

 public void open() throws SQLException { database = dbHelper.getWritableDatabase(); } 

Solutions Collecting From Web of "如何在Android中正确打开/closuresSQLite数据库"

如果您使用的是DatabaseHelper类的实例,并且在初始化DBHelper对象之后,则每次在数据库中工作时,都应在开始工作之前调用open方法,然后创build一个新的游标,查询数据库,使用刚存储在光标中的信息,closures游标后closures数据库。 例如,如果你想抓住数据库中的每一个项目,你可以这样做:

 ... DataBaseHelper db = new DataBaseHelper(this); ... db.open(); Cursor cursor = db.getAllItems(); maxCount = cursor.getCount(); Random gen = new Random(); row = gen.nextInt(maxCount); // Generate random between 0 and max if (cursor.moveToPosition(row)) { String myString = cursor.getString(1); //here I want the second column displayString(myString); //private method } cursor.close(); db.close(); 

getAllItems是我的DatabaseHelper中的一个公共方法,看起来像这样,以防万一你想知道

  public Cursor getAllItems() { return db.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_NAME }, null, null, null, null, null); } 

这是我如何访问我的数据库,我没有得到任何你得到的错误,它完美的作品。

你可能没有正确地处理你的数据库。 你正在打开更多的数据库实例比你正在closures。

有许多devise模式可以用来纠正这种行为。 您可能想要了解更多信息,请参阅此答案 。

我曾经这样做@Shikima上面提到的方式,但在复杂的应用程序中有许多后台服务,multithreading等,当你必须pipe理许多数据库实例,打开和closures它们时,它会变得非常烦人。

为了克服这个,我使用了下面的方法,似乎工作正常。

1。

在你的Application基类中声明并初始化YourDBHelperClass的一个实例,如下所示:

 public class App extends Application { public static YourDBHelperClass db; @Override public void onCreate() { super.onCreate(); db = new YourDBHelperClass(getApplicationContext()); db.open(); } } 

2。

在你的活动或任何你想使用数据库的地方,初始化YourDBHelperClass对象,如下所示:

 YourDBHelperClass db = App.db; 

然后,您可以随意使用数据库,而无需担心每次手动打开和closures它。 当应用程序被销毁时, SQLiteOpenHelper负责closuresclosures