Android 安装应用程序时创建初始SQLiteDatabase

Android 安装应用程序时创建初始SQLiteDatabase,android,database,sqlite,Android,Database,Sqlite,我正在编写一个应用程序,显示有趣的事实(以及它们的来源)。用户可以逐个浏览这些事实 以下是我想到的设计: 在SQLiteDatabase中创建一个表,其中包含一个文本列,用于存储有趣的事实,另一个列用于存储其源。(不确定这是否是最好的方法,但我希望即使没有网络也能使用该应用程序) 我的问题是,当数据库最初在设备上创建时,我是否应该从代码中手动填充数据库,如以下pseodo代码:- @Override public void onCreate(SQLiteDatabase db) {

我正在编写一个应用程序,显示有趣的事实(以及它们的来源)。用户可以逐个浏览这些事实

以下是我想到的设计:
在SQLiteDatabase中创建一个表,其中包含一个文本列,用于存储有趣的事实,另一个列用于存储其源。(不确定这是否是最好的方法,但我希望即使没有网络也能使用该应用程序)

我的问题是,当数据库最初在设备上创建时,我是否应该从代码中手动填充数据库,如以下pseodo代码:-

    @Override
public void onCreate(SQLiteDatabase db) {

    //Create the table

    //Populate the table
        //Insert statement 1
        //Insert statement 2
        //Insert statement 3
                          ...
        //Insert statement 500

}

在安装应用程序时,一定有更好的方法来创建初始数据库吗

你确定你真的需要一个数据库吗?这难道不是给如此琐碎的事情增加了不必要的开销吗

你不能在代码中声明数组吗,或者我遗漏了什么?无论是在数据库中还是在代码中,它都会占用空间。db会增加一些开销,并且需要一些时间来加载,加上您的代码必须处理错误,等等

在代码中声明一个简单的数组不是更好吗?还是我错了什么明显的东西?(也许用户可以d/l一个新的数据库?但这比d/l一个新程序的开销要大得多吗?)

如果我偏离了方向,请解释(而不是否决)。我想帮忙



编辑:想必你已经有你的事实了?也许在文本文件中?您可以编写代码来解析它,并初始化和数组(或填充数据库)。它基本上应该是for循环的缩写。

使用从SQLiteOpenHelper派生的类

我已经在我的博客www.xenonite.net上写了一些东西

public class myDatabase extends SQLiteOpenHelper
{
    private static final String     DB_NAME     = "database.db";
    private static final int    DB_VERSION  = 1;

    public MyDatabase(Context context)
    {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        db.execSQL("CREATE TABLE tbl_test ( id INTEGER PRIMARY KEY AUTOINCREMENT, test TEXT NOT NULL )");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        db.execSQL("DROP TABLE IF EXISTS tbl_test");
        onCreate(db);
    }
}
你可以这样使用它

myDatabase db = new myDatabase(getApplicationContext());

sql = "INSERT INTO tbl_test (test) VALUES ('xyz')";
db.getWritableDatabase().execSQL(sql);

String sql = "SELECT id FROM tbl_test"; 
Cursor result = db.getWritableDatabase().rawQuery(sql, null);

int value;

while(result.moveToNext())
{
        value = result.getInt(0);
}

在每次调用db时,都会调用myDatabase.onCreate(),因此将在第一次运行时创建数据库。更改表结构时,请实现onUpgrade()和increment DB_VERSION

Hi,感谢您花时间回答这个问题。每个事实都有其来源。所以我想到了一个2列的表(3列包括id)。我希望跟踪id,以便用户下次访问应用程序时,它显示下一个事实,从它停止的地方开始,而不是再次显示第一个事实。我想我可以做一个二维数组,并跟踪索引号在首选项中的位置。不确定什么是最好的设计解决方案。希望我的回答有意义。我同意莱昂尼克斯的解决方案。你有些事实。如果它已经是一个文本表单(csv、xml等),您可以将该文件放在res/raw目录中,安装后可直接使用或填充数据库。