[英]iOS SQLite FMDB Transactions.. Correct usage?
我將嘗試使用帶有 FMDB SQLite iOS 包裝器的事務。
文檔對交易有點含糊,但通過快速查看一些功能,我得出了以下邏輯:
[fmdb beginTransaction];
// Run the following query
BOOL res1 = [fmdb executeUpdate:@"query1"];
BOOL res2 = [fmdb executeUpdate:@"query2"];
if(!res1 || !res2) [fmdb rollback];
else [fmdb commit];
您還可以使用 FMDatabaseQueue 來處理您的事務,它是 fmdb 的一部分:
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];
if (whoopsSomethingWrongHappened) {
*rollback = YES;
return;
}
// etc…
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];
}];
如果第一次失敗,我不會嘗試進行第二次更新。
bool ret = false;
[fmdb beginTransaction];
ret = [fmdb executeUpdate:@"query1"];
if (ret)
{
ret = [fmdb executeUpdate:@"query2"];
if (!ret)
{
// report error 2
}
}
if(ret)
{
if (![fmdb commit])
{
// panic!
}
}
else
{
if (![fmdb rollback])
{
// panic!
}
}
對於偏執的魯棒性,您應該有一個 try...catch 塊,以防萬一引發異常。 如果你這樣做,你可以利用它來發揮你的優勢。
[fmdb beginTransaction];
@try
{
if (![fmdb executeUpdate:@"query1"])
{
// report error
@throw someExcpetion;
}
if (![fmdb executeUpdate:@"query2"])
{
// report error
@throw someExcpetion;
}
[fmdb commit]
}
@catch(NSException* e)
{
[fmdb rollback];
// rethrow if not one of the two exceptions above
}
Swift方式:
let queue = FMDatabaseQueue(path: databaseURL.path!)
queue.inTransaction() {
db, rollback in
result = db.executeUpdate("INSERT INTO client VALUES (NULL, ?)", client.name ?? "")
if result {
client.ID = Int(db.lastInsertRowId())
} else {
rollback.initialize(true)
print("\(__FUNCTION__) insert into table failed: \(db.lastErrorMessage())")
}
}
queue.close()
這似乎是一個有效的使用場景,我可能會在執行回滾之前添加輸出-lastErrorMessage
和-lastErrorCode
的值,以便您了解到底出了什么問題。
更好的是,在每個-executeUpdate
之后進行這些調用,這樣您就會知道每個語句之后是否發生錯誤:
[fmdb beginTransaction];
// Run the following query
BOOL res1 = [fmdb executeUpdate:@"query1"];
if (!res1) {
NSLog(@"Error %d - %@", [fmdb lastErrorMessage], [fmdb lastErrorCode]);
}
BOOL res2 = [fmdb executeUpdate:@"query2"];
if (!res2) {
NSLog(@"Error %d - %@", [fmdb lastErrorMessage], [fmdb lastErrorCode]);
}
if(!res1 || !res2) [fmdb rollback];
else [fmdb commit];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.