在ios中的多个表上的Sqlite批量插入错误

时间:2016-02-22 06:49:44

标签: ios objective-c sqlite ios9

我有超过200个表,每个表都没有记录。这些数据来自服务器,然后进入应用程序内部。我将数据同步到本地sqlite db。我正在使用以下方法批量插入表及其数据

+(BOOL)doUpdateQuery:(NSString *)query withParams:(NSArray *)params {
//static sqlite3 *masterDB;
 // static sqlite3_stmt *init_statement = nil;

    NSString* statement;

    statement = @"BEGIN EXCLUSIVE TRANSACTION";

    if (sqlite3_prepare_v2(dataBase, [statement UTF8String], -1, &query_stment, NULL) != SQLITE_OK) {
        printf("db error: %s\n", sqlite3_errmsg(dataBase));
        return NO;
    }
    if (sqlite3_step(query_stment) != SQLITE_DONE) {
        sqlite3_finalize(query_stment);
        printf("db error: %s\n", sqlite3_errmsg(dataBase));
        return NO;
    }

    statement = query;
    sqlite3_stmt *compiledStatement;

    if(sqlite3_prepare_v2(dataBase, [statement UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK)
    {
       // for(int i = 0; i < [params count]; i++){
        int i = 0;
        for(id param in params){
            i++;
           // NSString *param = [params objectAtIndex:i];
            if ([param isKindOfClass:[NSString class]] )
                sqlite3_bind_text(query_stment, i, [param UTF8String], -1, SQLITE_TRANSIENT);
            if ([param isKindOfClass:[NSNumber class]] ) {
                if (!strcmp([param objCType], @encode(float)))
                    sqlite3_bind_double(query_stment, i, [param doubleValue]);
                else if (!strcmp([param objCType], @encode(int)))
                    sqlite3_bind_int(query_stment, i, [param intValue]);
                else if (!strcmp([param objCType], @encode(long)))
                    sqlite3_bind_int(query_stment, i, [param longValue]);
                else if (!strcmp([param objCType], @encode(long long)))
                    sqlite3_bind_int64(query_stment, i, [param longLongValue]);
                else if (!strcmp([param objCType], @encode(BOOL)))
                    sqlite3_bind_int(query_stment, i, [param intValue]);
                else
                    NSLog(@"unknown NSNumber %@",[NSNumber class]);
            }
            if ([param isKindOfClass:[NSDate class]]) {
                sqlite3_bind_double(query_stment,i , [param timeIntervalSince1970]);
            }
            if ([param isKindOfClass:[NSData class]] ) {
                sqlite3_bind_blob(query_stment, i, [param bytes], [param length], SQLITE_STATIC);
            }
            while(YES){
                NSInteger result = sqlite3_step(compiledStatement);
                if(result == SQLITE_DONE){
                    break;
                }
                else if(result != SQLITE_BUSY){
                    printf("db error: %s\n", sqlite3_errmsg(dataBase));
                    break;
                }
            }
            sqlite3_reset(compiledStatement);

        }

        // COMMIT
        statement = @"COMMIT TRANSACTION";
        sqlite3_stmt *commitStatement;
        if (sqlite3_prepare_v2(dataBase, [statement UTF8String], -1, &commitStatement, NULL) != SQLITE_OK) {
            printf("db error: %s\n", sqlite3_errmsg(dataBase));
            return NO;
        }
        if (sqlite3_step(commitStatement) != SQLITE_DONE) {
            printf("db error: %s\n", sqlite3_errmsg(dataBase));
            return NO;
        }

        //     sqlite3_finalize(beginStatement);
        sqlite3_finalize(compiledStatement);
        sqlite3_finalize(commitStatement);
        return YES;
    }

    return YES;

}

并发送以下方法实现的数据

+(BOOL) insertTable:(NSString *)TableName columnNames:(NSArray *)arrColumns data:(NSArray *) arrData {

[stringQuery setString:[NSString stringWithFormat:@"INSERT INTO %@ VALUES (",TableName]];

for (int i=1; i<=[arrColumns count]; i++) {
    [stringQuery appendFormat:@"?%d",i];
    if(i!=[arrColumns count])
        [stringQuery appendString:@","];
}

[stringQuery appendString:@")"];

NSLog(@"DBQuery******************************** %@",stringQuery);

if ([DBManager doUpdateQuery:stringQuery withParams:arrData]) {
    return YES;
}

return NO
}

但我使用这个我无法插入数据。我收到错误,例如无法在交易中启动交易。如何解决这个问题我做错了什么

0 个答案:

没有答案