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

ios中多个表上的Sqlite批量插入错误,ios,objective-c,sqlite,ios9,Ios,Objective C,Sqlite,Ios9,我有200多个表,每个表都有记录。这些数据在进入应用程序之前来自服务器。我将数据同步到本地sqlite数据库。我使用以下方法批量插入表及其数据 +(BOOL)doUpdateQuery:(NSString *)query withParams:(NSArray *)params { //static sqlite3 *masterDB; // static sqlite3_stmt *init_statement = nil; NSString* statement; st

我有200多个表,每个表都有记录。这些数据在进入应用程序之前来自服务器。我将数据同步到本地sqlite数据库。我使用以下方法批量插入表及其数据

+(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)doUpdateQuery:(NSString*)带参数的查询:(NSArray*)参数{
//静态sqlite3*masterDB;
//静态sqlite3_stmt*init_语句=nil;
NSString*语句;
语句=@“开始独占事务”;
if(sqlite3\u prepare\u v2(数据库,[statement UTF8String],-1,&query\u stment,NULL)!=SQLITE\u OK){
printf(“数据库错误:%s\n”,sqlite3_errmsg(数据库));
返回否;
}
如果(sqlite3\u步骤(查询项目)!=SQLITE\u完成){
sqlite3_finalize(查询投资);
printf(“数据库错误:%s\n”,sqlite3_errmsg(数据库));
返回否;
}
语句=查询;
sqlite3_stmt*编译语句;
if(sqlite3\u prepare\u v2(数据库,[statement UTF8String],-1,&compiledStatement,NULL)=SQLITE\u OK)
{
//对于(int i=0;i<[params count];i++){
int i=0;
for(参数中的id参数){
i++;
//NSString*param=[params objectAtIndex:i];
if([param iskindof类:[NSString类]])
sqlite3_bind_text(查询语句,i,[param UTF8String],-1,SQLITE_TRANSIENT);
if([param iskindof类:[NSNumber类]]){
如果(!strcmp([param objCType],@encode(float)))
sqlite3_bind_double(查询语句,i,[param doubleValue]);
否则如果(!strcmp([param objCType],@encode(int)))
sqlite3_bind_int(查询语句,i,[param intValue]);
否则如果(!strcmp([param objCType],@encode(long)))
sqlite3_bind_int(查询语句,i,[param longValue]);
否则如果(!strcmp([param objCType],@encode(long-long)))
sqlite3_bind_int64(查询语句,i,[param longValue]);
否则如果(!strcmp([param objCType],@encode(BOOL)))
sqlite3_bind_int(查询语句,i,[param intValue]);
其他的
NSLog(@“未知NSNumber%@,[NSNumber类]);
}
if([param iskindof类:[NSDate类]]){
sqlite3_bind_double(查询语句,i,[param timeintervalnce1970]);
}
if([param iskindof类:[NSData类]]){
sqlite3_bind_blob(查询语句,i,[param bytes],[param length],SQLITE_STATIC);
}
虽然(是){
NSInteger result=sqlite3\u步骤(compiledStatement);
如果(结果==SQLITE_完成){
打破
}
else if(结果!=SQLITE\u忙){
printf(“数据库错误:%s\n”,sqlite3_errmsg(数据库));
打破
}
}
sqlite3_重置(编译语句);
}
//承诺
语句=@“提交事务”;
sqlite3项目*承诺陈述;
if(sqlite3\u prepare\u v2(数据库、[statement UTF8String]、-1、&commitStatement,NULL)!=SQLITE\u OK){
printf(“数据库错误:%s\n”,sqlite3_errmsg(数据库));
返回否;
}
如果(sqlite3\u步骤(提交声明)!=SQLITE\u完成){
printf(“数据库错误:%s\n”,sqlite3_errmsg(数据库));
返回否;
}
//sqlite3_最终确定(开始陈述);
sqlite3_最终确定(编译语句);
sqlite3_最终确定(承诺陈述);
返回YES;
}
返回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
}
+(BOOL)insertTable:(NSString*)TableName columnNames:(NSArray*)arrColumns data:(NSArray*)arrData{
[stringQuery设置字符串:[NSString stringWithFormat:@“插入%@值(“,TableName]”);

对于(int i=1;i您不理解错误消息的哪一部分?@CL.我不理解错误无法在transaction@CL.此方法逐个插入列值我做错了什么您知道事务是什么吗?BEGIN和COMMIT语句做什么?@CL.transaction表示查询中的更改..BEGIN mean事务和提交的起点是事务的端点