在分布式应用程序[Android]的.apk中嵌入数据库

在分布式应用程序[Android]的.apk中嵌入数据库,android,database,embedded-database,Android,Database,Embedded Database,我的问题很简单,但我不认为答案是。。。 我的应用程序中有很多内容可以让它正常运行,我正在考虑将所有内容都放在一个数据库中,然后将其与市场上的应用程序一起分发到一个嵌入式数据库中。 唯一的问题是我不知道怎么做。 我知道我可以用数据库的内容从EclipseDDMS中提取一个文件.db,我想我需要将它放在我的应用程序的资产文件夹中,但是如何让应用程序使用它来重新生成应用程序数据库呢? 如果您有一些代码或帮助的链接,那就太好了。 谢谢要实现您的要求,您可以将.db文件放在您的资产/目录中,并在第一次启动

我的问题很简单,但我不认为答案是。。。 我的应用程序中有很多内容可以让它正常运行,我正在考虑将所有内容都放在一个数据库中,然后将其与市场上的应用程序一起分发到一个嵌入式数据库中。 唯一的问题是我不知道怎么做。 我知道我可以用数据库的内容从EclipseDDMS中提取一个文件.db,我想我需要将它放在我的应用程序的资产文件夹中,但是如何让应用程序使用它来重新生成应用程序数据库呢? 如果您有一些代码或帮助的链接,那就太好了。
谢谢

要实现您的要求,您可以将.db文件放在您的资产/目录中,并在第一次启动应用程序时将其复制到位

final String DB_DESTINATION = "/data/data/YOUR_PACKAGE_NAME/databases/MyDatabaseFile.db";

// Check if the database exists before copying
boolean initialiseDatabase = (new File(DB_DESTINATION)).exists();
if (initialiseDatabase == false) {

    // Open the .db file in your assets directory
    InputStream is = getContext().getAssets().open("MyDatabaseFile.db");

    // Copy the database into the destination
    OutputStream os = new FileOutputStream(DB_DESTINATION);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = is.read(buffer)) > 0){
        os.write(buffer, 0, length);
    }
    os.flush();

    os.close();
    is.close();
}
其中,“initialiseDatabase”是指示应用程序是否首次启动的标志


尽管如此,如果您正在考虑存储大量数据,正如您所提到的:我强烈建议您避免使用APK文件膨胀,并在应用程序启动后使用Internet连接下载数据库记录(从托管服务器)。通过这种方式,您可以显示一个进度条,向用户指示他们为什么等待很长时间才开始使用应用程序。使APK特别大通常会阻止人们首先安装它

您可以实现中间解决方案:使用上述方法,但不要分发db文件,而是将其放在服务器上的某个地方。根据我的经验,获取文件只需10%的处理时间,其余部分是解析图像并将其序列化到db

嗯,我以前使用过进度条,但由于我下载了大量图片,解析了多个XML,这需要相当多的时间,特别是当您使用3G网络而不是WIFI时,检查数据库是否已经存在而不是使用布尔值不是更容易吗?当应用程序关闭时,如何跟踪布尔值?数据库中的条目?这正是布尔值所表示的,我把它作为一个实现练习。我已经更新了示例代码,说明了如何进行此操作。使用“APK中的bundle”方法而不是在发布时下载数据并没有错,只是要小心,如果超过5-10MB,人们很可能会避免安装你的应用程序。在现有的Android手机上,手机内存储实在太有价值了。不,不,我只是加载了1.8Mo,但是,我得到了一个关于资产最大大小的错误。。。告诉我我的1.8Mo超过了允许的1Mo…实际上我的目的是避免将其放在服务器上,并在安装应用程序后直接强制下载…我理解。我曾考虑在我的应用程序中使用它,但后来我考虑了db大小和另外一个+350K。人们对此很敏感,但如果你有良好的连接,它肯定会比后续处理的零碎下载更快