sqlite3 -ios-数据库已锁定



我正在为iPad开发一个应用程序,并且我正在使用sqlite句子(选择,更新,插入,删除)。

i打开(sqlite3_open)每个句子结尾处的开始和关闭(sqlite3_close)的数据库。但是有时我有"数据库已锁定"消息。

我不知道该怎么办才能解决这个问题。

谢谢,很抱歉提供了这些小信息。

如果我没记错的话,sqllite的问题是您一次只能访问一次。如果您有多个线程,则可以在这种情况下运行。示例:

在线程T1上运行Method1(访问数据库)。在x秒后在线程T2上运行Method2(访问数据库)。

如果Method1在这些X秒内未完成,则两种方法都将同时访问它。而且,正如我所说,我知道Sqllite不支持这一点。

您应该尝试标记数据库的使用情况,如果要访问它,但它正在使用,请在x秒后重试。这样:

- (void) generalMethodThatUsesDatabses
{
    if(databaseIsUsed)
    {
         [self performSelector:@selector(generalMethodThatUsesDatabses) withObject:nil afterDelay:5];
          return;
    }
    databaseIsUsed = TRUE;   //global bool variable

    //your code here
    databaseIsUsed = FALSE;
}

希望这会有所帮助。欢呼!

您可能在使用相同的模拟器之前打开数据库。总结所有操作到数据库并发布您始终的所有资源必须使用两种(!)语句:

sqlite3_finalize(statement);
sqlite3_close(database);

解决此问题的一种好方法是将其包裹到C 库中。这样,您可以在堆栈上创建库包装器。这意味着在功能范围内的时刻,您可以关闭毁灭仪中的连接。

(请注意,我为Objective-C使用参考计数)

例如:

NSArray* ScoreBoard::getAllScores()
{ 
      ScoreBoard::ensureExistingTable();
      //Stack allocated
      SqliteWrapper sqlite("Scores.sqlite");
     NSArray* result = sqlite.RunQuery("SELECT * FROM Scores ORDER BY ID DESC");
     return result;
     //after this, the sqlite destructor is called
}

Objective-C编译器允许您合并C 是非常好的。它可能非常有用。

 void SqliteWrapper::Close()
 {
     sqlite3_close(db);
 }

正如文森特指出的那样,您必须最终确定该声明。如果要保持连接打开,请在每个语句之后使用最终确定。丢弃连接的那一刻,关闭连接。

此方法对我有用。

它用于三甲基1. ISERT2.任意3.删除。

-(NSMutableArray *)resultSet
-(void)insertWithTitle:(NSString *)title Body:(NSString *)body
-(BOOL)updateAtIndex:(int)index Title:(NSString *)title Body:(NSString *)body
NSMutableArray *result = [[[NSMutableArray alloc] initWithCapacity:0] autorelease];
FMResultSet *rs = [db executeQuery:[self SQL:@"SELECT * FROM %@" inTable:TABLE_NAME]];
while ([rs next]) {
    Record *tr = [[Record alloc] initWithIndex:[rs intForColumn:@"id"]
                                         Title:[rs stringForColumn:@"title"]
                                          Body:[rs stringForColumn:@"body"]];
    [result addObject:tr];
    [tr release];
}
[rs close];

2 ....

return result;
[db executeUpdate:[self SQL:@"INSERT INTO %@ (title, body) VALUES (?,?)" inTable:TABLE_NAME], title, body];
if ([db hadError]) {
    NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);

删除记录:

BOOL success = YES;
[db executeUpdate:[self SQL:@"DELETE FROM %@ WHERE id = ?" inTable:TABLE_NAME], [NSNumber numberWithInt:index]];
if ([db hadError]) {
    NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
    success = NO;
}
return success;
}

最新更新