Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用已填充的应用程序数据库覆盖应用程序数据库_Java_Android_Database_File Io - Fatal编程技术网

Java 使用已填充的应用程序数据库覆盖应用程序数据库

Java 使用已填充的应用程序数据库覆盖应用程序数据库,java,android,database,file-io,Java,Android,Database,File Io,我正在使用博客文章中介绍的方法为我的Android应用程序创建初始填充的数据库 博客解释了如何使用存储在资产文件夹中的数据库文件,并将其复制到应用程序的数据库文件夹中。不过我使用了一种变体。我想很好地使用这个框架,并在我的SQLiteOpenHelper实现的onCreate()和onUpdate()函数中调用copy函数。这最初是可行的:当我从模拟器中提取数据库文件时,我可以验证数据库是否在数据库的标准位置上正确复制 奇怪的是,在第一次调用SQLiteOpenHelper.getWritab

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

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

奇怪的是,在第一次调用SQLiteOpenHelper.getWritableDatabase()之后,我还有一个断点。当我在那个断点拉取文件时,数据库是空的,除了标准的Android表“Android\u metadata”


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

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

我想有一次我试着用你的方式去做,但还是绕不过去,最终放弃了简洁的解决方案。最后我做了:

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

    return database;
}

SQLiteOpenHelper

中检查您在onCreate、onUpgrade等中的操作。您可能会覆盖复制的数据库。我在自己的代码中添加了断点,并逐行检查。它验证了onCreate和onUpdate函数之后是否会发生这种情况。这让我很惊讶Boris。如果框架将在onCreate()和onUpdate()方法之后覆盖文件,那么这些方法中的任何更改都将在之后被框架取消。框架认为可以使用sql语句来准备数据库,但不能覆盖数据库,这是有原因的。我完全同意你的观点,但事实就是这样。是否会在某个地方创建数据库,然后将其复制到预期的位置?或者,所有请求都打包在事务中,第一个操作是删除所有表(不太可能,尤其是在
onUpgrade
情况下)。这是其中一个选项。使用onUpgrade时,可能需要sql导出来重新填充数据库?威德的东西。无论如何,我像您一样解决了这个问题:通过在onCreate方法之外覆盖数据库。谢谢你的两分钱。