如果您的应用程序需要一个数据库,并且它带有内置数据,那么交付该应用程序的最佳方式是什么?我应该:

预创建SQLite数据库,并将其包含在。apk? 在应用程序中包含SQL命令,并让它在第一次使用时创建数据库并插入数据?

我所看到的缺点是:

可能的SQLite版本不匹配可能会导致问题,我目前不知道数据库应该去哪里以及如何访问它。 在设备上创建和填充数据库可能需要很长时间。

有什么建议吗?关于任何问题的文档指针将非常感激。


当前回答

目前还没有办法预先创建一个SQLite数据库来与apk一起发布。最好的方法是将适当的SQL保存为资源,并从应用程序中运行它们。是的,这会导致数据的重复(同样的信息作为资源和数据库存在),但目前没有其他方法。唯一的缓解因素是apk文件被压缩了。我的经验是908KB压缩到268KB以下。

下面的帖子有我找到的最好的讨论/解决方案,其中有很好的示例代码。

http://groups.google.com/group/android-developers/msg/9f455ae93a1cf152

我把我的CREATE语句存储为一个字符串资源,用Context.getString()读取,并用SQLiteDatabse.execSQL()运行。

我将插入的数据存储在res/raw/inserts中。sql(我创建了sql文件,7000+行)。使用上面链接的技术,我输入了一个循环,逐行读取文件,并将数据连接到“INSERT INTO tbl VALUE”,并执行另一个sqlitedatbase . execsql()。当它们可以连接时,保存7000个“INSERT INTO tbl VALUE”是没有意义的。

在模拟器上大约需要20秒,我不知道在真正的手机上需要多长时间,但它只发生一次,当用户第一次启动应用程序时。

其他回答

SQLiteAssetHelper库使得这个任务非常简单。

作为gradle依赖项添加它很容易(但Jar也可用于Ant/Eclipse),它的文档可以在以下地址找到: https://github.com/jgilfelt/android-sqlite-asset-helper

注意:这个项目不再维护如上所述的Github链接。

如文档中所述:

Add the dependency to your module's gradle build file: dependencies { compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+' } Copy the database into the assets directory, in a subdirectory called assets/databases. For instance: assets/databases/my_database.db (Optionally, you may compress the database in a zip file such as assets/databases/my_database.zip. This isn't needed, since the APK is compressed as a whole already.) Create a class, for example: public class MyDatabase extends SQLiteAssetHelper { private static final String DATABASE_NAME = "my_database.db"; private static final int DATABASE_VERSION = 1; public MyDatabase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } }

目前还没有办法预先创建一个SQLite数据库来与apk一起发布。最好的方法是将适当的SQL保存为资源,并从应用程序中运行它们。是的,这会导致数据的重复(同样的信息作为资源和数据库存在),但目前没有其他方法。唯一的缓解因素是apk文件被压缩了。我的经验是908KB压缩到268KB以下。

下面的帖子有我找到的最好的讨论/解决方案,其中有很好的示例代码。

http://groups.google.com/group/android-developers/msg/9f455ae93a1cf152

我把我的CREATE语句存储为一个字符串资源,用Context.getString()读取,并用SQLiteDatabse.execSQL()运行。

我将插入的数据存储在res/raw/inserts中。sql(我创建了sql文件,7000+行)。使用上面链接的技术,我输入了一个循环,逐行读取文件,并将数据连接到“INSERT INTO tbl VALUE”,并执行另一个sqlitedatbase . execsql()。当它们可以连接时,保存7000个“INSERT INTO tbl VALUE”是没有意义的。

在模拟器上大约需要20秒,我不知道在真正的手机上需要多长时间,但它只发生一次,当用户第一次启动应用程序时。

将数据库导入apk,然后复制到/data/data/…将使数据库的大小增加一倍(1在apk, 1在data/data/…),并将增加apk的大小(当然)。所以你的数据库不应该太大。

我写了一个库来简化这个过程。

dataBase = new DataBase.Builder(context, "myDb").
//        setAssetsPath(). // default "databases"
//        setDatabaseErrorHandler().
//        setCursorFactory().
//        setUpgradeCallback()
//        setVersion(). // default 1
build();

它将从assets/databases/myDb.db文件创建一个dataBase。 此外,你会得到所有这些功能:

从文件加载数据库 同步访问数据库 使用SQLite - Android通过requery, Android特定分发最新版本的SQLite。

从github克隆。

Android已经提供了一种版本感知的数据库管理方法。这种方法已经在Android应用程序的BARACUS框架中得到了利用。

它使您能够在应用程序的整个版本生命周期中管理数据库,能够将sqlite数据库从任何以前的版本更新到当前版本。

此外,它还允许您运行SQLite的热备份和热恢复。

我不是100%确定,但是针对特定设备的热恢复可能使您能够在应用程序中发布准备好的数据库。但我不确定数据库二进制格式,这可能特定于某些设备,供应商或设备代。

因为这些东西是Apache许可证2,所以可以随意重用代码的任何部分,这些代码可以在github上找到

编辑:

如果您只想传送数据,可以考虑在应用程序第一次启动时实例化和持久化pojo。BARACUS有一个内置的支持(内置的键值存储配置信息,例如。"APP_FIRST_RUN"加上一个后上下文引导钩子,以便在上下文上运行后启动操作)。这使得你可以在应用中使用紧密耦合的数据;在大多数情况下,这符合我的用例。