Ios 我的更新功能有什么问题?在sqlite数据库锁定错误后完全更新了吗?
当我运行应用程序时,该函数是否能完美工作?没有任何问题,但数据库被锁定后的功能?功能有什么问题请给我解决方案 我有很多表,所以在关闭数据库后,当所有时间戳更新时,我会在函数中打开数据库一次 下面是bindSQL函数Ios 我的更新功能有什么问题?在sqlite数据库锁定错误后完全更新了吗?,ios,sqlite,thread-safety,Ios,Sqlite,Thread Safety,当我运行应用程序时,该函数是否能完美工作?没有任何问题,但数据库被锁定后的功能?功能有什么问题请给我解决方案 我有很多表,所以在关闭数据库后,当所有时间戳更新时,我会在函数中打开数据库一次 下面是bindSQL函数 - (void) updateTimeStamp:(NSDictionary *) record forRowID: (NSString *) updateTableName { int dictionarySize = [record count]; NSMutabl
- (void) updateTimeStamp:(NSDictionary *) record forRowID: (NSString *) updateTableName
{
int dictionarySize = [record count];
NSMutableData *dKeys = [NSMutableData dataWithLength:sizeof(id) *dictionarySize];
NSMutableData * dValues = [NSMutableData dataWithLength: sizeof(id) * dictionarySize];
[record getObjects:(__unsafe_unretained id *)dValues.mutableBytes andKeys:(__unsafe_unretained id *)dKeys.mutableBytes];
[dValues appendBytes:&updateTableName length:sizeof(id)];
NSString * query = [NSString stringWithFormat:@"update %@ set %@ = ? where Table_Name= ?",tableName,[[record allKeys] componentsJoinedByString:@" = ?, "]];
[self bindSQL:[query UTF8String] withVargs:(va_list)dValues.mutableBytes];
if(sqlite3_step(statment) == SQLITE_DONE);
{
NSLog(@"prepead Timestamp %s",sqlite3_errmsg(database));
}
sqlite3_reset(statment);
@synchronized(self)
{
if(sqlite3_finalize(statment) != SQLITE_OK)
{
NSLog(@"doQuery: sqlite3_finalize failed (%s)", sqlite3_errmsg(database));
}
}
}
此代码创建两个语句对象:
- (void) bindSQL:(const char *) cQuery withVargs:(va_list)vargs
{
int param_count;
NSLog(@"%d",sqlite3_prepare_v2(database, cQuery, -1, &statment, NULL));
if(sqlite3_prepare_v2(database, cQuery, -1, &statment, NULL) != SQLITE_OK)
{
NSLog(@"bindSQL: could not prepare statement (%s) %s", sqlite3_errmsg(database), cQuery);
statment = NULL;
return;
}
if((param_count = sqlite3_bind_parameter_count(statment)))
{
for(int i =0; i < param_count ;i++)
{
id object = va_arg(vargs,id);
if(object == nil)
{
sqlite3_bind_null(statment, i+1);
}
else if ([object respondsToSelector:@selector(objCType)])
{
if(strchr("islqISLBQ", *[object objCType]))
{
sqlite3_bind_int(statment, i+1, [object intValue]);
}
else if (strchr("fd", *[object objCType]))
{
sqlite3_bind_double(statment, i+1, [object doubleValue]);
}
else
{
NSLog(@"bindSQL: Unhandled objCType: %s query: %s", [object objCType], cQuery);
statment = NULL;
return;
}
}
else if ([object respondsToSelector:@selector(UTF8String)])
{
sqlite3_bind_text(statment, i+1, [object UTF8String], -1, SQLITE_TRANSIENT);
}
else if ([object isEqual:[NSNull null]])
{
statment = NULL;
return;
}
else
{
NSLog(@"bindSQL: Unhandled parameter type: %@ query: %s", [object class], cQuery);
statment = NULL;
return;
}
}
}
va_end(vargs);
return;
}
其中只有一个是后来定稿的
如果要检查返回代码,最好使用变量:
NSLog(@"%d",sqlite3_prepare_v2(database, cQuery, -1, &statment, NULL));
if(sqlite3_prepare_v2(database, cQuery, -1, &statment, NULL) != SQLITE_OK)
WTF是否继续使用该代码?此代码工作正常,您不了解的内容@TrojanFoetIt是疯狂的。显示bindSQL代码。我正在添加bindSQL函数@CL。发生了相同的数据库锁定错误。我打开关闭数据库,我检查了很多次。我的代码中没有出现的问题@氯。
int rc = sqlite3_prepare_v2(database, cQuery, -1, &statment, NULL);
NSLog(@"%d", rc);
if (rc != SQLITE_OK)