java - 用填充的数据库覆盖您的应用程序数据库

标签 java android database file-io

我正在使用本博文中介绍的方法为我的 Android 应用创建初始填充数据库。

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

该博客解释了如何使用存储在 Assets 文件夹中的数据库文件并将其复制到应用程序的数据库文件夹中。不过我使用一种变体。我想很好地使用该框架,并在 SQLiteOpenHelper 实现的 onCreate() 和 onUpdate() 函数中调用复制函数。这最初是有效的:当我从模拟器中提取数据库文件时,我可以验证数据库是否已正确复制到数据库的标准位置。

现在奇怪的是,我在第一次调用 SQLiteOpenHelper.getWritableDatabase() 之后立即也有一个断点。当我在该断点处拉取文件时,除了标准 Android 表“android_metadata”之外,数据库为空。

Android 会以某种方式覆盖该文件,或者该文件未正确保存在文件系统上。有人知道我可以在哪里寻找解决方案吗?

最佳答案

是的,这会发生,因为 oncreateonUpgrade 是在 SQLiteOpenHelper 的构造函数中调用的。他们可以对传入的数据库对象进行编辑,但构造函数随后将继续进一步修改数据库(例如添加android_metadata表)。这可能会覆盖您复制粘贴的文件。

我想有一次我尝试按照你的方式做,但无法绕过它,最终放弃了这个简洁的解决方案。最后我做了:

public SQLiteDatabase getSQLiteDatabase() {
    SQLiteDatabase database = getReadableDatabase();
    if(!isDatabaseCopied) {
        copyDatabase();
        isDatabaseCopied = true;
        database = getReadableDatabase();
    }

    return database;
}

这在SQLiteOpenHelper

关于java - 用填充的数据库覆盖您的应用程序数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689532/

相关文章:

java - 如何限制java中哈希集的默认排序

Java - Tomcat : Reload context. xml 无需重启服务器

database - 如何完全删除 MarkLogic 数据库及其服务器和林?

xml - 将表迁移到 Sql XML 字段

java.lang.SecurityException : get package info: Neither user 1010004 nor current process has android. 权限.INTERACT_ACROSS_USERS

java - 执行特定组的 javax 验证

android - 无法更改 MotionLayout 中 TextInputLayout 的可见性

java - 跨平台Java?安卓和桌面

Android:向 tableRow 添加并排 View

mysql - 如何在phpMyAdmin上导入需要300s以上的大sql文件?