如何在Android中干净地处理多个数据库表?

时间:2011-05-14 01:52:24

标签: android sql

我正在尝试创建一个Android应用程序,可以处理已玩游戏及其分数的历史记录,但是当我从记事本教程中扩展时,这就变成了像这样重复陈述的老鼠窝:

private static final String GAME_TABLE_CREATE =
"create table " + GAME_TABLE + " (_id integer primary key autoincrement, " 
+ "title text not null);";
private static final String PLAY_TABLE_CREATE =
    "create table " + PLAY_TABLE + " (_id integer primary key autoincrement, " 
    + "game_id integer, game_date date);";
private static final String PLAYER_TABLE_CREATE =
    "create table " + PLAYER_TABLE + " (_id integer primary key autoincrement, " 
    + "name text not null);";
private static final String SCORE_TABLE_CREATE =
    "create table " + SCORE_TABLE + " (_id integer primary key autoincrement, " 
    + "game_id int, player_id int, score int);";

   ...

public void onCreate(SQLiteDatabase db) {
db.execSQL(GAME_TABLE_CREATE);
db.execSQL(PLAY_TABLE_CREATE);
db.execSQL(PLAYER_TABLE_CREATE);
db.execSQL(SCORE_TABLE_CREATE);
}

这似乎是可读性和可维护性的噩梦。关于如何更好地管理多个SQL表,并将这些类型的列表变成漂亮的干净循环的任何建议?我正在考虑尝试通过资源字符串数组来完成它,但还是无法弄清楚如何管理它。

3 个答案:

答案 0 :(得分:0)

我没有在Android世界中处理这个问题,而是在过去的Web世界中。我说初学者你可能想看看ORM来管理你的陈述。似乎有一些可能有帮助的指针here

答案 1 :(得分:0)

我通过使用语句//formatter: off关闭Eclipse中的格式(必须使用Helios或更高版本)来管理它(之后将其打开)。 This SO question会为您提供更多相关信息。

我还将所有初始SQL语句(CREATE,Triggers等)放在静态String数组中。这样,您的所有语句都可以在onCreate中使用此代码运行:

public static final String[] SQL_CREATE_TABLES = new String[] { TABLE_1, TABLE_2};

@Override
public void onCreate(SQLiteDatabase db) {
     for (String sql : SQL_CREATE_TABLES)
         db.execSQL(sql);
}

SQL语句也可以放在strings.xml资源文件中,但我认为这不会有助于保持可读性或可维护性。

答案 2 :(得分:0)

我在第一次开始时遇到了同样的问题,管理创建表因为Android应用程序内部的语句变得非常麻烦,特别是在开发过程中尝试更新模式。对我来说真正有用的只是将我的数据库副本放在assets文件夹中,然后将数据库复制到数据文件夹。 DBAdapter第一次启动时,您可以检查数据库是否已存在,如果不存在,则可以复制数据库。在表格需要预先填充数据或预先加载数据进行测试时,这也很方便。它使得在基于普通/ GUI的数据库工具中管理数据库模式变得更加容易。 有很多Android复制数据库代码示例,简单的Google搜索应该为您设置正确的方向。 希望这可以帮助, 欢呼声,

相关问题