Android 存储应用程序数据库模式

Android 存储应用程序数据库模式,android,sqlite,schema,Android,Sqlite,Schema,在示例中,应用程序数据库在大多数情况下是单个表,所以db模式存储在静态变量中 在单独的文件中存储大型模式对我来说更友好 我该怎么做?我考虑过使用资源(R.strings.db_模式),但可能有更好的方法 有人能给我一些建议吗?你可以把模式数据放在一个原始文件的res/raw下。然后您可以第一次加载并解析该文件。我的方法是每个表有一个类,以带有“table”后缀的表命名(例如PlayerTable或EventTable) 这些类包含表名和所有字段名的所有静态变量,还包含两个静态方法: public

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

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

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


有人能给我一些建议吗?

你可以把模式数据放在一个原始文件的res/raw下。然后您可以第一次加载并解析该文件。

我的方法是每个表有一个类,以带有“table”后缀的表命名(例如
PlayerTable
EventTable

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

public static void onCreate(SQLiteDatabase database)
public static void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion)
这样我的
SQLiteOpenHelper
就可以调用所有这些变量,而不必在所有字段中使用数百个静态变量并创建查询。例如:

@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();
    }
}

将文件读入一个字符串,然后将该字符串传递给
execSQL()
。您有任何公共代码可与数据库代码管理共享吗?还没有,抱歉:)但基本上这些原则就是我上面提到的。更多详细信息:如果您对任何特定的内容感兴趣,我可以在答案中添加更多详细信息。您能给我看一下PlayerTable代码,也许还有一个使用PlayerTable的DAO类吗?非常感谢,所以PlayerTable只创建或销毁表,而Player或Event类是POJO类?是的。My*表类只创建/销毁,但它们的主要目的是保存表的模式。Player/Event/etc实际上是POJO,基本上是DTO(数据传输对象),它仅用于在DAO和我的客户机类(通常是活动或任何长时间的异步任务)之间传递这些概念。
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);
}