存储应用程序数据库架构

时间:2011-12-03 22:12:03

标签: android sqlite schema

在示例应用程序数据库中,大多数情况下是单表,因此数据库模式存储在静态变量中。

在单独的文件中存储大型模式对我来说更友好。

我该怎么做?我考虑过使用资源(R.strings.db_schema),但可能有更好的方法。

有人可以给我任何建议吗?

2 个答案:

答案 0 :(得分:1)

您可以将架构数据放在res / raw下的原始文件中。然后你可以第一次加载并解析该文件。

答案 1 :(得分:1)

我的方法是每个表都有一个类,以带有“Table”后缀的表命名(例如PlayerTableEventTable)。

这些类包含表名和所有字段名的所有静态变量,它们还包含两个静态方法:

public static void onCreate(SQLiteDatabase database)
public static void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion)

这样我的SQLiteOpenHelper就可以调用所有这些,而不需要包含所有字段的数百个静态变量并创建查询。 E.g:

@Override
public void onCreate(SQLiteDatabase database) {
    PlayerTable.onCreate(database);
    EventTables.onCreate(database);
    ..... any other table you have .....
}

然后将此类注入到我的所有数据访问对象中(选择/更新/插入查询)。对于他们,我有专门的类,包含我的所有方法,功能(例如EventHandlingDAO用于处理事件处理的所有查询。)

最后,在需要时,将这些DAO注入到需要它们的活动中。

编辑:有关我的代码的更多详细信息:

我的主要对象是DAO(数据访问对象),其中我有以下方法:

// in EventHandlingDAO:
public void addEvent(Event event) {
    SQLiteDatabase database = databaseHelper.getWritableDatabase();
    try {
        database.execSQL("INSERT INTO " + EventTable.EVENT_TABLE_NAME + " (...."); // list of fields and values
    } finally {
        database.close();
    }
}

public List<Event> getAllEvents() {
    final List<Event> result = new ArrayList<Event>();
    SQLiteDatabase database = databaseHelper.getReadableDatabase();
    try {
        final Cursor cursor = database.rawQuery("SELECT " + EventTable.KEY_NAME + ", " + EventTable.KEY_DATE_AS_STRING + " FROM " + EventTable.TABLE_NAME, null); 
        cursor.moveToFirst();
        // ... rest of the logic, that iterates over the cursor, creates Event objects from the cursor columns and add them to the result list
        return result;

    } finally {
        database.close();
    }
}

所以在那个DAO中,我有了我的databaseHelper对象,它使用我上面讨论过的方法实现了扩展SQLiteOpenHelper的类。

当然,我有所有DAO的接口,所以我可以在我的测试中注入一个Stub或模拟实现(或者如果我想尝试基于SharedPreference的另一个解决方案,可以尝试不同的实现)

PlayerTable表的代码:

public static void onCreate(SQLiteDatabase database) {
    database.execSQL(TABLE_CREATE); // TABLE_CREATE is my "CREATE TABLE..." query
}

public static void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
    // A bit blunt, that destroys the data unfortunately, I'll think about doing something more clever later ;)
    database.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(database);
}