Android:从资产文件夹复制数据库,但只获取一个空文件

4af*_*eb6 7 sqlite android android-assets

各位,我将数据库从本地资产文件夹复制到/ data/data/package_name/databases目录时遇到问题.当我使用http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ 教程来做这件事时,我只能获得一个空文件.

我引用了copyDataBase()方法的一部分并没有区别.每次应用程序启动时,它都会创建目录和空数据库.那么有什么方法可以使copyDataBase()工作吗?

非常感谢你!!

Gre*_*llo 15

你为什么不从资产中复制?这样做是完全正常的.但是你不能在onCreate中做到这一点,那时已经创建了一个空数据库.你需要事先做好.我通常在getWriteableDatabase的覆盖中执行此操作,例如

public synchronized SQLiteDatabase getWritableDatabase() {
    SQLiteDatabase db = null;

    if (!doesDatabaseExist()) {
        try {
            copyDatabase();
            db = super.getWritableDatabase();
        } catch(Exception ex) {
            Log.e("Database Log", getDatabasePath() + " failed to copy correctly. " + ex.getLocalizedMessage());
        }
    }
    else {
        db = super.getWritableDatabase();
    }

    return db;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不得不改变它:`if(!doesDatabaseExist()){try {SQLiteDatabase db = super.getReadableDatabase(); db.close(); } catch(异常忽略){} copyFromAssets(); return super.getReadableDatabase(); 否则它崩溃了FileNotFoundException,可能是因为数据库目录不存在.(Android 2.2) (3认同)

Luk*_*uth 1

我不会从assets- 文件夹中复制任何数据库。如果您的数据库中需要一些标准条目,您可以在 -methodINSERT中使用 s添加它们onCreate()


更新:由于这是错误的(这有点正确)而被否决,而且我无法删除它,所以这里有一个小更新。

我想说这取决于您想要添加到数据库中的标准条目数量。如果只是一两个,那么运输打包的数据库可能不值得。

无论如何,一些应用程序带有相当大的数据库(例如,食谱集合)。显然你不能在代码中添加所有这些。

  • 对于小型测试条目,我仍然更喜欢简单地将它们添加到onCreate().
  • 对于更大的数据库,您应该预先填充它们并将它们与您的应用程序一起发送。

为了使后者正常工作,您需要将数据库文件复制到assets/您的应用程序文件夹中。有一个很好的库可以为您处理这个问题:android-sqlite-asset-helper

  • 为什么不从资产中复制数据库文件?就我而言,它是一个 R/O 数据库,包含 19 个表和 35k 行插入语句。我看不出为什么要在设备上初始化这样的数据库。我有什么遗漏的吗? (5认同)