将数据库从/ assets复制到app的私有存储的正确方法

时间:2014-05-10 10:29:04

标签: android database sqliteopenhelper

我在/assets目录中有模板数据库。必须将此数据库复制到主应用程序的数据库中,该数据库位于专用存储区域中。

现在,我在互联网上看到的所有样本对我来说都很奇怪。即,它们都扩展SQLiteOpenHelper,然后创建初始化和复制方法,但onCreateonUpgrade方法留空

这看起来不是一种正确的方式,但我已经在StackOverflow和Internet博客上看到它作为多个线程的答案。

这真的是一种正确的方法吗?因为我想在onCreate内(在扩展SQLiteOpenHelper的类中)以我第一次创建与模板数据库匹配的数据库的方式进行应对,然后用模板数据库中的数据填充它。

3 个答案:

答案 0 :(得分:4)

我建议使用SQLiteAssetHelper库:

它已成为这项技术的标准,并为您完成所有艰苦的工作。

集成到您的项目中就像包含1个jar文件一样简单。


例如,这是我的数据库助手类 - 你可以看到它继承自SQLiteAssetHelper,但是为了从/assets目录中复制数据库,我没有编写代码。这一切都是为我处理的。

public class DbHelper extends SQLiteAssetHelper
{
    private static final String DATABASE_NAME = "NameOfDbFile.sqlite";
    private static final int DATABASE_VERSION = 2;

    public DbHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

        // delete old database when upgrading
        setForcedUpgrade(DATABASE_VERSION);
    }


// ... and below a basic query as if it was any old SQLiteOpenHelper subclass

    public Cursor getUsers()
    {
        SQLiteDatabase db = getReadableDatabase();
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

        qb.setTables(User.TABLE);
        Cursor c = qb.query(db, User.COLUMNS, null, null, null, null, null);

        c.moveToFirst();
        return c;
    }

    // etc...
}

我起初犹豫不决,为此使用了一个库,但使用它非常简单。


但是,如果你想自己重做这项工作,那么你可以看看这个库是如何做到的,因为它是Github上的开源。

答案 1 :(得分:0)

我个人而不是在assets文件夹中使用预先填充的数据库,我会创建一个包含初始数据的xml文件,并编写一个intentService(http://code.tutsplus.com/tutorials/android-fundamentals-intentservice-basics--mobile-6183)来读取该xml并在第一次启动时填充主数据库。

  

现在,我在互联网上看到的所有样本对我来说都很奇怪。   也就是说,它们都扩展了SQLiteOpenHelper然后创建   初始化和复制方法,但保留onCreate和onUpgrade   方法空洞。

根本没什么奇怪的。您将使用此资产数据库进行的所有操作都是将数据从资产数据库复制到应用程序数据库,那么为什么还需要其他任何方法?

答案 2 :(得分:0)

好吧,我不太确定我明白你需要什么, 并且关于Richard Le Mesurier的答案,如果这段代码从资产中复制数据库..那很好

但如果我是你,我会在我的RAW中包含一个文本文件,其中包含db的转储数据

INSERT INTO ... (...
INSERT INTO ... (...
INSERT INTO ... (...

等......

然后在dbHelper的onCreate(),我会像往常一样创建表,然后在RAW文件中执行sql语句。

现在不需要

onUpgrade(), 对于下一个版本,如果在另一个RAW文件中包含更多数据,则将使用它 即使您可以包含DELETE语句...或只是通过onUpgrade()

处硬编码的查询修改数据库