iOS中的Sqlite插入问题

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..

我需要在db中存储用户双击计数。工作正常。 如果我快速双击插入,就会出现问题(数据库被锁定,没有这样的表:内存不足)。如何处理这个问题

提前谢谢

我试过这个,仅供参考:

 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-双击就像发送不同的图片感谢您的回复