Как использовать SQLite3 Pragma User_Version в Objective-C?
-
27-09-2019 - |
Вопрос
Я пытаюсь проверить user_version of sqlite db. У меня есть инструмент администратора, чтобы поднять версию, но я не понимаю синтаксис оператора Pragma. Я ожидаю проверить ценность в IF-утверждении. Может кто-нибудь предоставить образец кода? Когда я встроил оператор Pragma в моем заданном коде объекта-C, компилятор бросает ошибку.
Решение
Я понял его с вдохновением от 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;"
Другие советы
Прагма заявления не можешь использоваться в других заявлениях (нет никаких ссылок на прагма-STMT из других заявлений).
Но вы можете использовать значение user_version, сделав два запроса: запросы прагмы и используя выбранное значение в качестве буквального в следующем запросе.
Уполномоченный: Если вы заинтересованы в синтаксисе прагмы, это довольно просто:
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 в Objective-C, попробуйте смотреть на Соседние вопросы: пример. Отказ К сожалению, я никогда не закодировался в объекте - с.
Если вы используете обертку 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.