繁体   English   中英

sqlite3 - iOS - 数据库被锁定

[英]sqlite3 - iOS - database is locked

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

我在开头打开(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);
 }

正如文森特指出的那样,你必须完成声明。 如果要保持连接打开,请在每个语句后使用finalize。 丢弃连接时关闭连接。

这种方法适合我。

它用于三个1.isert 2.update 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;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM