Android预填充SQLite数据库

5
我在我的应用程序中有一个sqlite数据库。我的应用程序不应该将其作为空数据库,但是在用户首次使用应用程序之前需要创建某些记录。当然,我可以有许多插入语句,但这似乎很奇怪。我想到了像http://vineetyadav.com/tutorials/11-adding-prefilled-sqlite-database-to-android-app.html这样的东西,基本上可以工作,但这意味着我手动创建的DB也需要像android_metadata这样的所有内部表。因此,我需要知道存在哪些内部表以及如何填充它们。或者还有其他聪明的方法来拥有一个预先填充的数据库。有什么建议吗?
谢谢,A.

1
为什么不使用SQLiteOpenHelper来获取数据库连接,并覆盖它的onCreate方法,从资源中填充数据呢? - user634618
3个回答

3
您可以从SD卡中读取一个平面文件,每行使用1个插入语句,并遍历该文件。
以下是一个类似的示例,其中我读取一个文件并将ContactItem添加到我的联系人列表中:
public ArrayList<ContactItem> readInputFile(Context context, String filename) {
    String text = null;
    BufferedReader reader = null;
    ArrayList<ContactItem> contact_list = new ArrayList<ContactItem>();
    contact_list.clear();  // Clear any existing contacts when a new file is read
    try {
        reader = new BufferedReader(new FileReader(filename));
        // Repeat until EOF
        while (((text = reader.readLine()) != null)) {
            if (!(text.length() > 1024)) {  //  If we read more than 1k per line there's a problem with the input file format
                ContactItem c = new ContactItem(text);
                if (c.getIsValid()) {
                    //  We were able to parse a well formed phone number from the last line read
                    contact_list.add(c);
                }
            }
        }
    } catch (FileNotFoundException e) {
        Toast.makeText(context, R.string.error_fileNotFound, 1).show();
        e.printStackTrace();
    } catch (IOException e) {
        Toast.makeText(context, R.string.error_ioException, 1).show();
        e.printStackTrace();
    } finally { // EOFException (or other, but EOF is handled and most likely)
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException e) {
            Toast.makeText(context, R.string.error_generalFailure, 1).show();
            e.printStackTrace();
        }
    }
    return contact_list;
}

2

我将数据存储为JSON格式,并将其放置在res/raw目录中。当应用程序第一次打开时,我使用了AsyncTask,读取JSON文件(使用了GSON库)并用它来填充我的数据库。

我已经尝试了大约1000条记录,这对我有效。不过还是需要花费一些时间——在模拟器上大约需要15-30秒。

不确定这是否是最佳方式。


1

个人而言,我只是做了插入语句,但我只有两个,所以对我来说似乎不太过分。

如果你需要知道内部表,为什么不从你的应用程序中提取数据库,并使用任何SQLite数据库浏览器(我使用SQLite Database Browser)查看呢?

例如,在SQLite数据库浏览器中,android_metadata显示为由CREATE TABLE android_metadata(locale TEXT)创建。

可能插入一个语句以确保它看起来是这样的。

然后你就可以轻松地重新创建它并添加它了吗?


是和否,获取android_metadata,在我的情况下,它只包含我的语言环境。然后我需要弄清楚如何为这些用户设置它。我猜这是可能的。但这都是一些可能在我无法测试的设备上失败的猜测。作为最后的手段可以,但我更喜欢遵循规范... - AndyAndroid
如果您有超过2个条目,您会将初始值存储在数组中并放入数据库,还是放入平面文件或XML文件中? - AndyAndroid
啊...我不知道 - 抱歉。至于第二个问题 - 哎呀,我希望我知道最有效的方法是什么,但我不知道。我还是个新手 - 我的数据库只是一个简单的IP列表,所以实现起来很容易。 :)我的直觉告诉我XML或平面文件(可能比XML慢?)是一个好的做法,但不要听我的。 - Codemonkey
我猜测平面文件会更快,因为你不需要解析XML文件...但我也是个新手,也许有其他人知道... - AndyAndroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接