2010-08-12 84 views
3

從sqlite3的文檔,它看起來像我應該能夠使用以下語法在我的iPhone數據庫中更新行:sqlite3的更新行語法


NSString *dbFile = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"db"]; 
sqlite3 *database = NULL; 

if (sqlite3_open([dbFile UTF8String], &database) == SQLITE_OK) { 
NSString *sql = [NSString stringWithFormat:@"update mytable set myfirstcolumn=%d, mysecondcolumn=%d where id=%d", int1, int2, int3]; 
sqlite3_exec(database, [sql UTF8String], MyCallback, nil, nil); 
} 

sqlite3_close(database); 

但它不更新數據庫或甚至調用回調方法。這只是錯誤的語法,因爲在sqlite3_exec()不能執行更新例如?

在我的例子所有的列名是正確的,3個int值數作爲正確的價值觀,所以我種的想法......

感謝。

回答

0

sqlite3_exec通常返回一個錯誤代碼(int),而最後一個參數可以是一個指向將設置錯誤消息的字符串的指針。那些說什麼?

sqlite3_exec(database, [sql UTF8String], MyCallback, nil, &errorMsg); 
+0

嗨, 我剛剛檢查了錯誤代碼,它返回8(SQLITE3_READONLY),這是我現在探索的一個起點。我沒有意識到捆綁包中的文件是隻讀的。 任何想法在哪裏以及如何將數據庫文件放在讀寫區域? – 2010-08-12 15:16:09

+0

也應該有一個單一的數據庫實例,說在應用程序委託,所有其他類訪問?使用類似上面的代碼在不同類的原始消息中訪問數據庫將不斷創建原始數據庫的新實例並覆蓋任何新的更改,對吧? – 2010-08-12 15:24:25

+1

@Iain Hemstock - 您不需要擁有單個數據庫實例,但這樣做可能很有意義。通常,每個線程都有一個數據庫實例。數據庫更改將在應用程序中的所有數據庫實例對象之間共享。這是SQLite設計的方式。 – 2010-08-12 15:37:25

2

啊,對,找出了現在可以回答別人的查詢的過程。基本上我有資源包中的數據庫和我的測試的一些基本數據,我可以讀得很好。但是因爲bundle資源是隻讀的,所以我無法將數據寫回數據庫。

因此,解決方案是將數據庫以編程方式複製到應用程序啓動時的應用程序的Documents文件夾中,但使用代碼來查看數據庫是否已經存在(爲了不覆蓋它)。因爲這個文件夾是讀寫的,所以在更新數據庫時應該沒有問題。