【问题标题】:Prepopulated database - Android application预填充数据库 - Android 应用程序
【发布时间】:2011-07-17 17:29:01
【问题描述】:

我在构建具有预填充数据库的 android 应用程序时遇到了真正的麻烦。

请查看整个source code

我使用 sqlitebrowser 创建了一个数据库,并将其复制到我的 Android 应用程序中的“assets”目录中。

我在Java类DBAdapter.java中添加了从assets目录复制数据库的代码

MainActivity.java 中我调用了createDatabase 函数,所以如果数据库不存在,它应该从资产目录复制数据库。创建数据库后,我调用getAllContacts 函数并将其显示在页面上。

每当我执行项目时,它都会抛出一个我无法调试的错误。

谁能帮我解决这个问题?

更新:

Logcat 显示以下异常。 assets/MyDB.db 中的“联系人”表似乎没有被复制/创建,但我不知道为什么。

E/AndroidRuntime(  672): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.me.mydb/org.me.mydb.MainActivity}: android.database.sqlite.SQLiteException: no such table: contacts: , while compiling: SELECT _id, name, email FROM contacts
E/AndroidRuntime(  672):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime(  672):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(  672):        at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(  672):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(  672):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  672):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  672):        at android.app.ActivityThread.main(ActivityThread.java:4627)

【问题讨论】:

  • logcat 对此怎么说...?
  • 在哪里可以看到日志?抱歉,我是 Android 新手
  • 你必须手动在控制台上看到它http://developer.android.com/guide/developing/tools/logcat.html 如果你使用ADT它带有一个Logcat视图来查看你的日志
  • 谢谢.. 这是日志跟踪 E/AndroidRuntime(672): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.me.mydb/org.me.mydb.MainActivity }:android.database.sqlite.SQLiteException:没有这样的表:联系人:,编译时:SELECT _id,姓名,电子邮件来自联系人E/AndroidRuntime(672):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) E/AndroidRuntime(672): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
  • 天哪!您是否使用 Google Docs 作为代码的某种版本控制系统?请考虑github...

标签: android database sqlite


【解决方案1】:

这是一个很好的 link 让您开始。

本质上,这个想法是使用SQLiteOpenHelper 类,当不存在数据库时,您将一个预先播种的数据库逐字节复制到正确的位置。我在我的一个项目中对其进行了略微修改,但它似乎工作得很好

【讨论】:

  • 我也使用这个实现并推荐它。但是,有时它可能有点变化无常,并且无法正确复制整个数据库,因此请确保检查应用程序中的某个位置是否可以正常复制。
  • @Paul.s 我按照链接中给出的相同程序进行操作。但没有成功。如果你能调试我的代码并告诉我问题出在哪里,那就太好了..
  • @Espiandev 你能把工作代码/项目发给我吗?
  • @Paul.s 我创建了一个新项目并复制了此处给出的相同代码reigndesign.com/blog/… 我得到以下异常 I/Database(425): sqlite returned: error code = 14, msg = cannot在源代码行 25467 E/Database(425) 打开文件: sqlite3_open_v2(“/data/data/org.me.mdbtest/databases/MyDB.db”, &handle, 1, NULL) 失败 W/System.err(425): java.io.FileNotFoundException: MyDB.db
【解决方案2】:

copyDBFromResource(); 的行替换为以下代码 -

        SQLiteDatabase readDB = null; 
        readDB = this.getReadableDatabase();
        readDB.close();
        readDB = null;
        copyDBFromResource();

我认为这是必要的,因为您的代码本身无法在 Data 文件夹中创建文件,并且调用 getReadableDatabase() 会在那里为您创建 db 文件。 Android 2.2 以后需要在获取数据库句柄后关闭数据库,否则复制不会成功。

编辑:

如果还是不行,请尝试如下授予写入外部存储权限 -

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【讨论】:

  • 您可以尝试像我在上面的编辑中描述的那样授予 WRITE_EXTERNAL_STORAGE 权限(就在清单中的应用程序节点之后)吗?
  • @Abinav 我应该在哪里添加 ?我应该添加 AndroidManifest.xml 吗?
  • 是的,就在您的应用程序节点之后,在您的清单节点内。
【解决方案3】:

DataHelper 带有一个 onCreate 方法,您可以在那里创建数据库,甚至在那里填充。

Official Android documentation

第一次创建数据库时调用。这是哪里 表的创建和表的初始填充应该 发生。

事实上你已经重写了那个方法

 @Override
        public void onCreate(SQLiteDatabase db)
        {

        }

【讨论】:

  • Yeaaaah 我知道可以通过使用 onCreate 函数来创建数据库...但是如果数据库文件中已经创建了数百/数千行怎么办? Web 上的大多数 Android 示例和教程都在运行时创建和填充数据库......我正在寻找一个示例/教程,它可以是一个独立的、预加载的带有 Android 应用程序的数据库。你能告诉我我的代码有什么问题吗??
【解决方案4】:

我使用 onCreate 事件处理和一组 *.sql 脚本(在简单循环中逐行执行)。

当您还需要编写数据库更新例程时,这很方便。我有一个 sql 脚本来初始化一个新的(最新的)数据库和一组用于每个过时版本的数据库的 sql 脚本。

例如每当必须初始化新数据库时调用“create” sql 脚本,或者每当用户必须从版本更新他的数据库时调用脚本链“v1-update-to-v2”和“v2-update-to-v3”从版本 1 到版本 3。这比每个版本的单个更新脚本(如“v1-update-to-v3”和“v2-update-to-v3”)慢,但是当我添加新版本时,这个“链”更容易维护(我不需要更改旧脚本中的任何内容)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多