iOS中的Sqlite插入问题
我需要在db中存储用户双击计数。工作正常。 如果我快速双击插入,就会出现问题(数据库被锁定,没有这样的表:内存不足)。如何处理这个问题 提前谢谢 我试过这个,仅供参考:iOS中的Sqlite插入问题,ios,database,sqlite,insert,Ios,Database,Sqlite,Insert,我需要在db中存储用户双击计数。工作正常。 如果我快速双击插入,就会出现问题(数据库被锁定,没有这样的表:内存不足)。如何处理这个问题 提前谢谢 我试过这个,仅供参考: dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) { @try { if([self openAppDatabase] == YES) //If DB open success..
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void)
{
@try {
if([self openAppDatabase] == YES) //If DB open success...
{
sqlite3_stmt *statement = nil;
NSString *queryString = [NSString stringWithFormat:@"INSERT INTO %@ (%@,%@) values (?,?)",Tables_Count,lkt_TO,ttt_TIME];
BOOL prepareStatementResult = sqlite3_prepare_v2(databaseObj, [queryString UTF8String], -1, &statement, NULL);
if(prepareStatementResult == SQLITE_OK) {
sqlite3_bind_text(statement, 1, [contactNo UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 2, [sentDate UTF8String], -1, SQLITE_TRANSIENT);
if (sqlite3_step(statement) != SQLITE_DONE) {
DLog(@"Can't insert ---- Error");
}
}
else {
// In the database cannot be opened then show the error message on the debugger.
DLog(@"%s", sqlite3_errmsg(databaseObj));
}
// Release the compiled statement from memory.
sqlite3_finalize(statement);
}
[self closeAppDatabase]; //If DB not opened will close it here...
}
@catch (NSException *exception) {
DLog(@"@Exception --- %@",exception.reason);
}
}
您正在使用的调度队列是并发队列,而不是串行队列。结果是一次向数据库发出的请求太多。如果您将代码更改为使用
dispatch\u barrier\u async
,您应该可以,但我从未在系统队列上使用过它
此外,您的代码可能需要一些清理。try
是不必要的,因为此代码不会引发异常。与Java相反,Objective Chicago很少抛出异常
<>最后,你可以考虑使用一个目标C SQLite包装器,比如FMDatabase。它可以清理很多东西。您过于频繁地更新数据库,这就是它导致问题的原因。您可以保留一个存储doubleTap计数的局部变量。并在用户离开该屏幕时更新数据库。不要在任意后台队列上运行数据插入,而是创建一个后台队列,并将该队列用于所有数据库更新。这将序列化所有更新。还有,为什么每次都要打开和关闭数据库?在应用程序启动时打开数据库一次,并在整个过程中使用相同的连接。此外,如果数据库没有打开,为什么要关闭它?为什么即使准备失败也要完成准备好的声明?谢谢你的支持reply@Aneeq-双击就像发送不同的图片感谢您的回复