Хранение схемы базы данных приложения - PullRequest
2 голосов
/ 04 декабря 2011

В примере база данных приложений в большинстве случаев представляет собой одну таблицу, поэтому схема БД хранится в статической переменной.

Хранение большой схемы в отдельном файле более удобно для меня.

Как я могусделай это?Я думал об использовании ресурсов (R.strings.db_schema), но, возможно, есть лучший способ.

Может кто-нибудь дать мне какой-нибудь совет?

Ответы [ 2 ]

1 голос
/ 04 декабря 2011

Я могу создать класс для каждой таблицы, названный в честь таблицы с суффиксом «Таблица» (например, 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();
    }
}

Итак, в этом DAO у меня есть объект databaseHelper, который создает экземпляр моего класса, расширяющий SQLiteOpenHelper методами, о которых я говорил выше.

И, конечно, у меня есть интерфейсыко всем моим DAO, чтобы я мог внедрить в мои тесты заглушку или поддельную реализацию (или поэкспериментировать с другими реализациями, если я хочу попробовать другое решение, основанное, например, на 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);
}
1 голос
/ 04 декабря 2011

Вы можете поместить данные схемы в необработанный файл в res / raw.Затем вы можете просто загрузить и проанализировать этот файл в первый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...