我正在为ipad开发一个应用程序,我正在使用sqlite句子(选择,更新,插入,删除)。
我在开头打开(sqlite3_open)数据库,在每个句子的末尾关闭(sqlite3_close)。但有时候我会收到“数据库被锁定”的消息。
我不知道如何解决这个问题。
感谢并抱歉这个小信息。
答案 0 :(得分:6)
如果我没弄错的话,sqllite的问题是你一次只能访问一次。 如果您有多个线程,则可以在这种情况下运行。例如:
在线程t1上运行method1(访问数据库)。 在x秒之后在线程t2上运行method2(访问数据库)。
如果在这些x秒内没有完成method1,则两个方法将同时访问它。 而且,正如我所说,我知道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;
}
希望这会有所帮助。干杯!
答案 1 :(得分:3)
您可能在使用相同的模拟器之前打开了数据库。 完成对数据库的所有操作并始终释放所有资源 必须使用两个(!)语句:
sqlite3_finalize(statement);
sqlite3_close(database);
答案 2 :(得分:0)
解决此问题的一个好方法是将其包装到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。丢弃连接时关闭连接。
这种方法对我有用。
答案 3 :(得分:-1)
它用于三个方法 1.isert 2.更新 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;
}