我正在从Web服务请求一些json数据之前更新数据库表。有时响应失败。如果出现这种情况,我可以使用Objectivec回滚更新操作。
-(void)syncPhoneDBWithData:(NSData *)data{
NSDictionary *dictionary = [NSDictionary dictionaryWithJSONData:data];
if ([dictionary count]!= 0) {
NSArray *ticketsArray = [dictionary objectForKey:@"tickets"];
for (NSDictionary *ticketDict in ticketsArray) {
Ticket *ticketToStore = [[Ticket alloc]init];
ticketToStore.ticketID = [ticketDict objectForKey:@"ticketID"];
ticketToStore.ticketTitle = [ticketDict objectForKey:@"ticketTitle"];
ticketToStore.numberOfAdults = [ticketDict objectForKey:@"numberOfAdults"];
ticketToStore.numberOfChildren = [ticketDict objectForKey:@"numberOfChildren"];
ticketToStore.redeemed = [ticketDict objectForKey:@"redeemed"];
ticketToStore.syncStatus = [NSNumber numberWithInt:1];
if ([DBConnect isExistingTicket:ticketToStore.ticketID]) {
[DBConnect updateTicketRedeemStatus:ticketToStore];
}else{
[DBConnect insertNewTicket:ticketToStore];
}
}
}else{
NSLog(@"======================Empty============================");
}
}
+ (NSString *)insertNewTicket:(Ticket *)ticket{
NSString *lastInsertedTicketId = @"";
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:dbName];
sqlite3 *database;
if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) {
const char *sqlStatement = "insert into tickets (ticket_id , ticket_title , adults , children , redeem_status , sync_status, redeemed_dateTime ) VALUES (?,?,?,?,?,?,?)";
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
sqlite3_bind_text ( compiledStatement, 1, [ticket.ticketID UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text ( compiledStatement, 2, [ticket.ticketTitle UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_int ( compiledStatement, 3, [ticket.numberOfAdults intValue] );
sqlite3_bind_int ( compiledStatement, 4, [ticket.numberOfChildren intValue]);
sqlite3_bind_text ( compiledStatement, 5, [ticket.redeemed UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_int ( compiledStatement, 6, [ticket.syncStatus intValue] );
sqlite3_bind_int ( compiledStatement, 7, [ticket.redeemedDate timeIntervalSince1970]);
}
if(sqlite3_step(compiledStatement) != SQLITE_DONE ) {
NSLog( @"add new Ticket Error: %s", sqlite3_errmsg(database) );
}else{
lastInsertedTicketId = [NSString stringWithFormat:@"%lld",sqlite3_last_insert_rowid(database)];
}
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
return lastInsertedTicketId;
}
最佳答案
使用核心数据(包装到中)并撤消。 :)
关于objective-c - 如何使用Objective-C回滚对sqlite数据库执行的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23514809/