Как я использую sqlite3 ПРАГМУ user_version в Цели-c?

Я пытаюсь проверить user_version sqlite DB. У меня есть административное средство для столкновения версии, но я не понимаю синтаксис оператора прагмы. Я ожидаю тестировать значение в операторе "if". Кто-то может предоставить пример кода? Когда я встраиваю оператор прагмы в свой объективный-c код, компилятор бросает ошибку.

11
задан mobibob 17 April 2010 в 19:56
поделиться

2 ответа

Я понял это с вдохновением от newtover, покопавшись в FMDB и перечитав документацию sqlite3 (на мой взгляд, она все еще очень расплывчата). Этот код возвращает значение, которое я использовал в инструменте администрирования, когда я вношу заметные изменения в схему, требующие миграции.

-(int)queryUserVersion: (sqlite3*) db {
    // get current database version of schema
    static sqlite3_stmt *stmt_version;
    int databaseVersion;

    if(sqlite3_prepare_v2(db, "PRAGMA user_version;", -1, &stmt_version, NULL) == SQLITE_OK) {
        while(sqlite3_step(stmt_version) == SQLITE_ROW) {
            databaseVersion = sqlite3_column_int(stmt_version, 0);
            NSLog(@"%s: version %d", __FUNCTION__, databaseVersion);
        }
        NSLog(@"%s: the databaseVersion is: %d", __FUNCTION__, databaseVersion);
    } else {
        NSLog(@"%s: ERROR Preparing: , %s", __FUNCTION__, sqlite3_errmsg(db) );
    }
    sqlite3_finalize(stmt_version);

    return databaseVersion;
}

У меня есть аналогичный метод для версии схемы, где sql-оператор изменен на «PRAGMA schema_version;»

22
ответ дан 3 December 2019 в 03:17
поделиться

Операторы Pragma не могут использоваться в других операторах (нет ссылок на pragma-stmt из других операторов).

Но вы можете использовать значение user_version, сделав два запроса: запрос прагмы и использование выбранного значения как литерала в следующем запросе.

UPD : если вас интересует синтаксис PRAGMA, это довольно просто:

sqlite> pragma user_version=10;
sqlite> pragma user_version;
user_version
------------------------------
10
sqlite> pragma user_version='12.3.124';
sqlite> pragma user_version;
user_version
------------------------------
12

То есть результат будет в виде строки с одним значением.

Если вас интересует способ отправки операторов SQLite в объекте-c, попробуйте просмотреть вопросы соседей : пример . К сожалению, я никогда не кодировал Objective-c.

4
ответ дан 3 December 2019 в 03:17
поделиться