objective-c - 如何使用Objective-C回滚对sqlite数据库执行的操作

标签 objective-c sqlite rollback

我正在从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/

相关文章:

Objective-C 序列化复杂对象列表

ios - libobjc dealloc 中的 KERN_PROTECTION_FAILURE(堆栈溢出)

java - 在现有数据库中创建表 sqlite sugar orm

java - 处理 Apache ServiceComb 补偿方法中的附加数据

oracle11g - Oracle 11 - sqlplus - 在出错时回滚整个脚本 - 如何?

iphone - CoreData 向实体行添加新关系

objective-c - 如何使用 SpriteKit Physics Joint Limit 制作绳索?

mysql - 两个保存点之间的嵌套事务回滚?

android - 内容提供者中的生命周期/流量控制?

PHP Sqlite3(不是 PDO!)交易?