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

时间:2010-06-22 00:17:52

标签: android database sqlite

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

这是我想到的设计:
在SQLiteDatabase中创建一个表,其中包含存储fun-fact的文本列和存储其源的第二列。 (不确定这是否是最佳方式,但我希望即使没有网络也可以使用该应用程序)

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

    @Override
public void onCreate(SQLiteDatabase db) {

    //Create the table

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

}

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

2 个答案:

答案 0 :(得分:2)

你确定你真的需要一个数据库吗?它不会给那些如此微不足道的东西增加不必要的开销吗?

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

你的代码中声明了一个简单的数组,你不是更好吗?还是我错了一些明显的东西? (也许用户可以推出新的数据库?但这比开发新程序要多得多吗?)

如果我要离开,请解释(而不是低调)。我正在努力帮助


编辑:大概你已经把事实弄到了哪里?也许在文本文件中?你可以编写代码来解析它并初始化和数组(或填充数据库)。它应该基本上是一个简短的循环。

答案 1 :(得分:1)

使用从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()并增加DB_VERSION