预填充数据库 - Android应用程序

时间:2011-07-17 17:29:02

标签: android database sqlite

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

请查看整个source code

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

我添加了从Java类DBAdapter.java

中的assets目录复制数据库的代码

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

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

有人可以帮我解决这个问题吗?

更新

Logcat显示以下异常。似乎资产/ 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)

4 个答案:

答案 0 :(得分:2)

这是一个很好的link来开始。

本质上,我们的想法是使用SQLiteOpenHelper类,当没有数据库存在时,您将预先插入的数据库字节(将字节)复制到正确的位置。我在我的一个项目中略有修改,但它的工作效果似乎很好

答案 1 :(得分:1)

使用以下代码替换显示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" />

答案 2 :(得分:0)

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

Official Android documentation

  

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

实际上你已经覆盖了那个方法

 @Override
        public void onCreate(SQLiteDatabase db)
        {

        }

答案 3 :(得分:0)

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

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

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