ios中多个表上的Sqlite批量插入错误
我有200多个表,每个表都有记录。这些数据在进入应用程序之前来自服务器。我将数据同步到本地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
+(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事务和提交的起点是事务的端点