我在构建具有预填充数据库的Android应用程序时遇到了麻烦。
请查看整个source code。
我使用sqlitebrowser创建了一个数据库,并将其复制到我的Android应用程序中的“assets”目录。
我添加了从Java类DBAdapter.java
在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)
答案 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”),但是当我添加新版本时,这个“链”更容易维护(我不需要在旧脚本中更改任何内容)。