【问题标题】:error creating database in android在android中创建数据库时出错
【发布时间】:2011-08-23 09:41:19
【问题描述】:

我在 android 的列表视图中显示数据库。我在另一个活动中显示列表视图。我通过调用一个名为“data”的类来在 oncreate 中创建数据库,该类扩展 sqliteopenhelper 并传递表,但是一旦我启动应用程序,DDMS 中的堆栈跟踪就是

08-23 14:29:07.771: ERROR/Database(5175): Leak found
08-23 14:29:07.771: ERROR/Database(5175): java.lang.IllegalStateException: /data/data/com.cortes/databases/location.db SQLiteDatabase created and never closed
08-23 14:29:07.771: ERROR/Database(5175):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1792)
08-23 14:29:07.771: ERROR/Database(5175):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:798)
08-23 14:29:07.771: ERROR/Database(5175):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:857)
08-23 14:29:07.771: ERROR/Database(5175):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:850)
08-23 14:29:07.771: ERROR/Database(5175):     at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:539)
08-23 14:29:07.771: ERROR/Database(5175):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
08-23 14:29:07.771: ERROR/Database(5175):     at com.cortes.Cortes.onCreate(Cortes.java:79)
08-23 14:29:07.771: ERROR/Database(5175):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-23 14:29:07.771: ERROR/Database(5175):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
08-23 14:29:07.771: ERROR/Database(5175):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
08-23 14:29:07.771: ERROR/Database(5175):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
08-23 14:29:07.771: ERROR/Database(5175):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
08-23 14:29:07.771: ERROR/Database(5175):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-23 14:29:07.771: ERROR/Database(5175):     at android.os.Looper.loop(Looper.java:123)
08-23 14:29:07.771: ERROR/Database(5175):     at android.app.ActivityThread.main(ActivityThread.java:4363)
08-23 14:29:07.771: ERROR/Database(5175):     at java.lang.reflect.Method.invokeNative(Native Method)
08-23 14:29:07.771: ERROR/Database(5175):     at java.lang.reflect.Method.invoke(Method.java:521)
08-23 14:29:07.771: ERROR/Database(5175):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
08-23 14:29:07.771: ERROR/Database(5175):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
08-23 14:29:07.771: ERROR/Database(5175):     at dalvik.system.NativeStart.main(Native Method)
08-23 14:29:07.846: ERROR/wpa_supplicant(2300): wpa_driver_priv_driver_cmd failed
08-23 14:29:07.846: ERROR/wpa_supplicant(2300): wpa_driver_priv_driver_cmd failed

我的代码是

db = this.openOrCreateDatabase("location.db", SQLiteDatabase.OPEN_READWRITE, null);
d = new data(this,Geo_Create_Table);
db=d.getWritableDatabase();

【问题讨论】:

  • data 是扩展 sqliteopenhelper 的新类的名称
  • 您是否在活动之间共享数据库?
  • 是的,我在活动之间共享表 geo_create_table

标签: android sqlite


【解决方案1】:

因为我还没有足够的声誉来发表评论>。

堆栈跟踪包含这个 SQLiteDatabase created and never closed,这让我相信数据库从未关闭过。我假设Android在这里对这三行感到不满 db = this.openOrCreateDatabase("location.db", SQLiteDatabase.OPEN_READWRITE, null); d = 新数据(this,Geo_Create_Table); db=d.getWritableDatabase(); 既然这就是你提供的一切,我想你也这么认为。如果我理解这是要做什么,那么您正在打开一个本地存储的数据库db,然后,我猜d 也在引用同一个本地存储的数据库。可能(不太确定)导致您的应用程序中的内存泄漏,但我知道的一件事是您需要在某处添加db.close()

您可以通过使用 try {} finally{db.close()} 来尝试其他用户提出的建议 Need help with Database Access in Android

【讨论】:

    【解决方案2】:

    您需要在离开活动之前关闭数据库连接。最好的方法是关闭onPause() 回调并打开onResume()。这将确保数据库连接始终处于有效状态。

    相关问题/答案herehere

    第二个链接显示了通过扩展Application 类来跨活动共享数据库连接的策略。

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多