我正在编写一个显示有趣事实的应用程序(以及它们来自的来源)。用户可以逐个浏览事实。
这是我想到的设计:
在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
}
当安装应用程序时,肯定有更好的方法来创建初始数据库吗?
答案 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