我有超过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
}
但我使用这个我无法插入数据。我收到错误,例如无法在交易中启动交易。如何解决这个问题我做错了什么