sqlite3 – iOS – 数据库被locking

我正在开发一个iPad的应用程序,我正在使用SQLite语句(select,更新,插入,删除)。

我打开(sqlite3_open)数据库的开始和closures(sqlite3_close)在每个句子的结尾。 但有时我得到了“数据库被locking”的消息。

我不知道我能做些什么来解决这个问题。

感谢和抱歉这个小小的信息。

如果我没有弄错,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 ++库中。 这样,你可以在堆栈上创build库包装器。 这意味着当函数超出范围时,可以closures析构函数中的连接。

(请注意,我使用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。 在丢弃连接的时候closures连接。

这个方法适用于我。

它用于三个方面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]); 

删除logging:

 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; }