在示例应用程序数据库中,大多数情况下是单表,因此数据库模式存储在静态变量中。
在单独的文件中存储大型模式对我来说更友好。
我该怎么做?我考虑过使用资源(R.strings.db_schema),但可能有更好的方法。
有人可以给我任何建议吗?
答案 0 :(得分:1)
您可以将架构数据放在res / raw下的原始文件中。然后你可以第一次加载并解析该文件。
答案 1 :(得分:1)
我的方法是每个表都有一个类,以带有“Table”后缀的表命名(例如PlayerTable
或EventTable
)。
这些类包含表名和所有字段名的所有静态变量,它们还包含两个静态方法:
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);
}