Как я могу использовать sqlite3 PRAGMA user_version в Objective-c? - PullRequest
11 голосов
/ 17 апреля 2010

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

Ответы [ 3 ]

22 голосов
/ 31 мая 2010

Я понял это по вдохновению 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;"

4 голосов
/ 20 апреля 2010

Прагматические выражения нельзя использовать в других утверждениях (в других выражениях нет ссылок на 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 в target-c, попробуйте посмотреть соседние вопросы : пример . К сожалению, я никогда не кодировал цель-c.

2 голосов
/ 07 января 2015

Если вы используете оболочку FMDB (что рекомендуется, если вы не хотите иметь дело с интерфейсом C-обработчика sqlite)

Используйте

[self.db setUserVersion:yourUserVersion]; // yourUserVersion is of uint32_t type

Для чтения текущего пользователя user_version

[self.db userVersion];                   // returned value is of uint32_t type

Документация:

http://ccgus.github.io/fmdb/html/Categories/FMDatabase+FMDatabaseAdditions.html

Этот ответ в основном является копией этого ответа: https://stackoverflow.com/a/27807125/1364174

...