我想檢查sqlite數據庫的user_version。我有一個管理工具來衝擊版本,但我不明白編譯指示語句的語法。我期待在if語句中測試這個值。有人可以提供代碼示例嗎?當我在我的objective-c代碼中嵌入pragma語句時,編譯器會引發錯誤。如何在Objective-c中使用sqlite3 PRAGMA user_version?
回答
我從newtover的靈感中發現了它,挖掘了FMDB並重新閱讀了文檔(在我看來,它仍然非常模糊)。當我對需要遷移的模式進行重要更改時,此代碼返回我在管理工具中遇到的值。
-(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語句。如果您正在使用FMDB包裝(這是建議,如果你不想處理的C處理改爲"PRAGMA schema_version;"
觸摸schema_version不是一個好主意:http://www.sqlite.org/pragma.html#pragma_user_version – 2013-05-09 00:43:40
@AntonChikin觸摸,你的意思是「只讀」?我認爲有一個版本的目的是讀取和測試這個值。我不打算修改它。爲什麼我不應該觸摸它。 – mobibob 2013-05-09 17:50:47
@mobibob Anton鏈接的sqlite網站有你的問題的答案,檢查出schema_version部分,第二段:http://www.sqlite.org/pragma.html#pragma_schema_version – davidfg4 2013-05-20 16:25:34
Pragma語句can not將用於其他語句中(其他語句中沒有對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
這就是結果會與單個值的行。
如果您對在objective-c中向SQLite發佈語句的方式感興趣,請嘗試查看neighbour questions:example。不幸的是,我從來沒有用Objective-C編碼過。
好的,我到目前爲止和你在一起。但是,幫助我進一步,你是否說我做了這樣的事情:sqlite3_prepare_v2(PRAGMA user_version); char * ver = sqlite_column_text(1);你能否提供一些代碼 - 我不明白該文檔。 – mobibob 2010-04-21 01:55:14
爲架構的版本類似的方法源碼的接口)
使用
[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
- 1. 不能在PRAGMA中使用sqlite3參數替換?
- 2. 在sqlite中設置user_version
- 3. 如何使用ServiceStack OrmLite從SQLite讀取PRAGMA?
- 4. 如何使PRAGMA選項設置爲永久sqlite3的
- 5. 如何使用gdata-objectivec-client?
- 6. 無法在SQLite中設置user_version
- 7. 檢索的SQLite附註user_version與Golang
- 8. 如何通過C-API運行SQLite3'PRAGMA'命令?
- 9. 如何在Xcode 5.1.1中使用sqlite3?
- 10. 在C#中使用pragma內在(sqrt,pow)?
- 11. 如何在objectiveC類中使用struct和union?
- 12. 如何在ObjectiveC中使用變量的值?
- 13. 如何在ObjectiveC項目中使用C++文件
- 14. 如何在ObjectiveC中聲明和使用3維數組?
- 15. 如何禁用#pragma警告?
- 16. 在Razor視圖中使用#pragma語句
- 17. Pragma在跨DLL中的使用
- 18. 在Oracle包體中使用Pragma
- 19. 使用類#pragma pack
- 20. 如何使用sqlite3和Python
- 21. 如何使用SQLite3與Java
- 22. 如何使用sqlite3的C++
- 23. 如何在多行中編寫#pragma openmp?
- 24. 我如何檢索和設置SQLite數據庫中的user_version與EF
- 25. #pragma init和#pragma fini在linux上使用gcc編譯器
- 26. 如何使用sqlite3的XCode中
- 27. 如何在Windows上使用sqlite3和masm32
- 28. 如何在PHP上使用SQLCipher for SQLite3
- 29. 在SQLite3中使用COUNT
- 30. 在Python中使用SQLite3
我更新我的例子回答。 – newtover 2010-04-21 08:06:45