Я пытаюсь проверить user_version базы данных sqlite. У меня есть средство администрирования, чтобы поднять версию, но я не понимаю синтаксис инструкции pragma. Я ожидаю проверить значение в if-statement. Может ли кто-нибудь предоставить образец кода? Когда я вставляю инструкцию pragma в мой код objective-c, компилятор выдает ошибку.
Как использовать user_version sqlite3 PRAGMA в Objective-c?
Ответ 1
Я понял это с вдохновением от 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;"
Ответ 2
Утверждения 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 в objective-c, попробуйте найти вопросы соседа: пример. К сожалению, я никогда не кодировался в objective-c.
Ответ 3
Если вы используете фреймворк 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
Этот ответ в основном является копией этого ответа: fooobar.com/info/74967/...