【问题标题】:Some Android devices report that the table (of a SQLite database) does not exist某些 Android 设备报告(SQLite 数据库的)表不存在
【发布时间】:2012-01-24 09:33:03
【问题描述】:

我编写了一个使用 SQLite 数据库的 Android 应用程序,该数据库保存在 assets 文件夹中。 该数据库有 4 个表:“table1”、“table2”、“table3”和“android_metadata”。该应用程序在大多数设备上运行良好,但报告了一些崩溃。所以我使用 acra(Android 应用程序崩溃报告,http://code.google.com/p/acra/)来收集日志。 我确信数据库有“table2”表,但是日志说没有这样的表。我真的很想知道为什么它在某些设备上运行良好,但在其他设备上却崩溃了? 手机型号为三星GT-I9001GT,安卓2.3.3。一些HTC渴望高清也有这个问题。 请帮我解决它。谢谢。

(数据库文件大小为33KB)

日志

java.lang.RuntimeException: Unable to start activity ComponentInfo{english.idiom/english.idiom.Category2Activity}: android.database.sqlite.SQLiteException: no such table: table2: , while compiling: SELECT subject,table2_id FROM table2 WHERE table1_id=8
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3687)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: no such table: table2: , while compiling: SELECT subject,table2_id FROM table2 WHERE table1_id=8
    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
    at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1324)
    at english.idiom.Category2Activity.getContents(Category2Activity.java:176)
    at english.idiom.Category2Activity.Initialize(Category2Activity.java:138)
    at english.idiom.Category2Activity.onCreate(Category2Activity.java:70)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
    ... 11 more
android.database.sqlite.SQLiteException: no such table: table2: , while compiling: SELECT subject,table2_id FROM table2 WHERE table1_id=8
    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
    at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1324)
    at english.idiom.Category2Activity.getContents(Category2Activity.java:176)
    at english.idiom.Category2Activity.Initialize(Category2Activity.java:138)
    at english.idiom.Category2Activity.onCreate(Category2Activity.java:70)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3687)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    您确实必须检查您愿意支持的设备。见

    /data/ 
    

    并检查您是否有相应的表。我去过那里,有些设备在包命名等方面确实不同。

    您可以使用类似aSQLiteManager 的应用来浏览架构。

    其他有用的资源:

    Debugging sqlite database on the device

    Android: Where are database files stored?

    【讨论】:

    • 非常感谢您的回复。我使用 String DB_PATH = "/data/data/english.idiom/databases/ 。这个 File dbFile = getDatabasePath(MY_DB_NAME); 有效吗?
    【解决方案2】:

    我的问题是:ACRA 日志中是否还有其他 SQL 错误?特别是关于数据库损坏?

    在我的问题中:Better SQLite corruption detection 我介绍了随机修改 DB 文件时 SQLite 行为的快速分析。当“SELECT *”失败时,有时 SQLite 会声称这是因为该表不存在。当我将修改后的数据库文件加载到编辑器中时,所有表都丢失了 - 因此,随机修改数据库文件实际上可能会删除所有表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多