android预填充sqlite数据库

android预填充sqlite数据库,android,sqlite,Android,Sqlite,我的应用程序中有一个sqlite数据库。我的应用程序不应该以空数据库的形式发布,但在用户第一次使用应用程序之前,需要创建某些记录。当然,我可以有很多insert语句,但这似乎很奇怪。我想到了一些基本上可以工作的东西,但这意味着我手动创建的DB也需要所有内部表,比如android_元数据。因此,我要么需要知道存在哪些内部表,以及如何填充它们。或者另一种拥有预填充数据库的聪明方法。有什么建议吗 谢谢,A.就我个人而言,我刚刚做了insert语句,但我只有2个,所以对我来说似乎不太过分 如果您需要了解

我的应用程序中有一个sqlite数据库。我的应用程序不应该以空数据库的形式发布,但在用户第一次使用应用程序之前,需要创建某些记录。当然,我可以有很多insert语句,但这似乎很奇怪。我想到了一些基本上可以工作的东西,但这意味着我手动创建的DB也需要所有内部表,比如android_元数据。因此,我要么需要知道存在哪些内部表,以及如何填充它们。或者另一种拥有预填充数据库的聪明方法。有什么建议吗


谢谢,A.

就我个人而言,我刚刚做了insert语句,但我只有2个,所以对我来说似乎不太过分

如果您需要了解内部表,为什么不从应用程序中提取数据库,并使用任何SQLite数据库资源管理器(我使用的)查看它呢

android_元数据在SQLite数据库浏览器中显示为由
创建表android_元数据(区域设置文本)
创建

可能会插入一条语句,以确保它看起来是这样的


然后,您可以轻松地重新创建并添加它?

您可以从SD卡读取一个平面文件,每行一条insert语句,然后迭代该文件

下面是一个类似的示例,其中我读取了一个文件并将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;
}
public ArrayList readInputFile(上下文,字符串文件名){
字符串文本=空;
BufferedReader reader=null;
ArrayList contact_list=新建ArrayList();
contact_list.clear();//读取新文件时清除所有现有联系人
试一试{
reader=newbufferedreader(newfilereader(filename));
//重复此操作直到EOF
而(((text=reader.readLine())!=null)){
如果(!(text.length()>1024)){//如果我们每行读取超过1k,则输入文件格式有问题
ContactItem c=新的ContactItem(文本);
if(c.getIsValid()){
//我们能够解析最后一行读取的格式良好的电话号码
联系人名单。添加(c);
}
}
}
}catch(filenotfounde异常){
Toast.makeText(context,R.string.error_fileNotFound,1.show();
e、 printStackTrace();
}捕获(IOE异常){
Toast.makeText(context,R.string.error_ioException,1.show();
e、 printStackTrace();
}最后{//EOFEException(或其他,但EOF已处理且最有可能)
试一试{
if(读卡器!=null){
reader.close();
}
}捕获(IOE异常){
Toast.makeText(context,R.string.error_generalFilure,1).show();
e、 printStackTrace();
}
}
返回联系人列表;
}

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

我已经尝试了大约1000张唱片,它对我很有效。这仍然需要一些时间——在模拟器上大约需要15-30秒


不确定这是否是最好的方法。

是和否,以android_元数据为例,在我的例子中,只有我的语言环境。然后我需要弄清楚如何为这些用户设置它。我想这是可能的。但这一切都是某种猜测,在我无法测试的设备上可能会失败。作为最后的手段,好的,但遵守我更喜欢的规范…添加问题:如果您有远远超过2个条目,您会将初始值存储在数组中并放入db或平面文件或xml文件中吗?啊。。。我不知道,对不起。至于第二个问题——呸,我希望我知道这样做最有效的方式是什么,但我不知道。我还是个新手-我的数据库只是一个简单的IP列表,所以很容易实现。:)我的直觉是xml或平面文件(可能比xml慢?)是一种好的做法,但不要相信我的话。我猜平面文件很快,因为您不必解析xml文件。。。但是我也是一个新手,也许其他人知道……为什么不使用SQLiteOpenHelper来获取数据库连接,并重写它的
onCreate
方法来填充资源中的数据呢?