在android上刷新和SQLite数据库

时间:2010-07-13 00:25:58

标签: android sqlite

我有一个使用SQLite数据库的android应用程序。我在应用程序启动时打开数据库,但从不关闭它,因为它一直在使用。

告诉数据库将其所有更改刷新到永久存储的最佳方法是什么?我是否需要关闭它并重新打开或者是否有更有效的方式?

我的问题是,在手机上进行测试时,在多次写入后关闭手机有时会导致数据库在重新启动应用程序时丢失最新的更新,这对数据库系统来说显然是不可接受的。

由于我无法了解如何捕获应用程序关闭事件,因此无法知道何时手动关闭数据库。

3 个答案:

答案 0 :(得分:9)

  

我在应用程序启动时打开数据库,但从不关闭它,因为它一直在使用。

不要那样做。您显然忽略了LogCat中出现的所有错误,抱怨您正在泄漏数据库连接。

  

告诉他们的最佳方式是什么?   数据库将其所有更改刷新到   永久存储?

It will do that automatically at the end of a transaction。默认情况下,每个单独的SQL操作(例如,插入)都是一个事务。

  

我是否需要关闭它并重新打开   还是有更有效的方式?

您应该在某个时刻关闭数据库(例如,正在调解数据库的服务的onDestroy())。

  

我的问题是在测试时   电话,关机后关机   写入次数有时会导致   数据库松动最近   应用程序时更新   重启,这显然是   数据库系统无法接受。

如果即使在正确关闭数据库连接后也可以创建演示问题的示例项目,请将其发布到Android issue tracker

  

因为我无法找到如何捕获   应用程序关闭事件我不能   知道何时手动关闭   数据库中。

当所有活动都从调解数据库连接的服务中解除绑定时,关闭它,触发该服务的onDestroy()方法。

或者,在需要访问数据库的每个组件中打开一个新连接,并使用Java同步来确保两个线程不会尝试同时使用数据库(如果需要)。

答案 1 :(得分:2)

如果您使用任何交易,它们将被嵌套。这意味着如果你在结束之前突破了一个。由于您从未关闭连接,因此在重新启动手机/应用程序时,您最终会回滚一些写入。

db.beginTransaction();
   try {
     ...
     db.setTransactionSuccessful();
   } finally {
     db.endTransaction();
   }

答案 2 :(得分:-1)

这是在Droid上吗?你怎么关掉手机?除非你取出电池,否则关闭手机会慢慢关闭操作系统,此时它会将所有内容都记录下来。

什么时候丢失数据库?每个应用程序重新启动后,还是随机?如果是在每次重启之后,听起来更像是你在启动时破坏了数据库。