【发布时间】:2012-03-14 18:22:35
【问题描述】:
信息:
所以我想在安装应用程序时创建一个数据库,插入一些数据并且不再更改它们,只从数据库中读取。举个例子:想想安装愤怒的小鸟时的关卡,它们很可能是从某个地方读取的,并在第一次安装时放入数据库中,然后从那里读取。从未改变(除非游戏更新)。
我的想法“愤怒的小鸟”游戏的关卡以相同的方式具有以下框架代码:
public class GameDBHelper extends SQLiteOpenHelper{
private SQLiteDatabase database;
public static final String TAG = GameDBHelper.class.getSimpleName();
//Insert static database variables here
public GameDBHelper( Context ctx ) {
super(ctx,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE_STATEMENT);
insertAllGames(); //Method to read data from all game files and insert into database
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + TABLE_GAMES); //Should be "alter table"
Log.d(TAG, "onUpgrade dropped table " + TABLE_GAMES);
this.onCreate(db);
}
private void insertAllGames(){
//Method that reads all files and inserts into database
}
}
按照惯例,我还有一个使用 GameDBHelper 的类的框架代码。这应该只有一个将在 Activity 中使用的查询方法:
public class GameDataSource {
private static final String TAG = GameDataSource.class.getSimpleName();
private SQLiteDatabase database;
private GameDBHelper gameDBHelper;
public GameDataSource(Context con, OTHER_DATA_AS_NEEDED) {
gameDBHelper = new GameDBHelper(con);
Log.d(TAG, "GameDataSource object created!");
}
public Cursor query(DATA_AS_NEEDED) throws SQLException{
database = gameDBHelper.getReadableDatabase();
return database.query(QUERY_STATEMENT);
}
}
问题:
- 应该在哪里调用 insertAllGames() 方法?这里是否应该涉及一些“如果不存在则创建”?
- 骨架代码看起来是创建这样一个数据库的好习惯吗?
- 既然这是一张静态表,可以使用“drop table”还是应该一直努力使用“alter table”?如果是这样,您能否提供一个很好地使用“alter table”的示例?
- “drop table”(或“alter table”)是否放置在正确的位置?
提前致谢!
【问题讨论】:
-
您要存储什么类型的数据?如果您的意思是级别数据,那么不,数据库不是答案。可能,像愤怒的小鸟这样的游戏使用专有文件格式将其关卡存储在 APK 文件中。将这样的数据写入数据库会非常缓慢和浪费。
-
您可以添加在文件夹 assets 上创建的 SQLite 数据库,其中包含所有数据。所以它会随您的应用程序一起提供
-
@dymmeh 因此,例如扫描纯文本文件以获取关卡所需的数据会比从数据库中读取数据更快吗?我想到的数据本质上是文本和数字。
-
视情况而定,但如果只是简单的文本和数字,DB 就可以了。数据库访问可能比直接从文件读取稍慢,但如果您正在处理大文件,那么数据库将派上用场。如果您想坚持使用数据库,@PedroTeran 所说的是一个很好的解决方案。
-
您可以考虑为此使用
SQLiteAssetHelper。