我的Iphone应用程序出了问题。 有些时候我的应用程序运行成功,但在某些情况下它会给“数据库锁定异常”,这就是为什么我无法从sqlite数据中读取或插入数据。 如果有人有解决方案,请建议我。 这是我将数据插入数据库的代码 感谢。
-(void)insertDataIntoDatabase
{
NSLog(@"insertDataIntoDatabase-----1");
@try{
tUserName=userNameTf.text;
tLevel=[NSString stringWithFormat:@"%d",level];
tMoves=[NSString stringWithFormat:@"%d",moves];
NSLog(@"tLevel;;;%@",tLevel);
// NSString *tdatabaseName = @"FlipScoreBord.sqlite";
sqlite3_stmt *addStatement;
// NSArray *tdocumentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSString *tdocumentsDir = [tdocumentPaths objectAtIndex:0];
// NSString *tdatabasePath = [tdocumentsDir stringByAppendingPathComponent:tdatabaseName];
NSString *insertQuery = [NSString stringWithFormat:@"INSERT INTO Moves (User_Name,User_Label,User_Moves) VALUES('%@','%@','%@')",tUserName,tLevel,tMoves];
const char *sql = [insertQuery cStringUsingEncoding:NSUTF8StringEncoding];
if(sqlite3_prepare_v2(tdatabase, sql, -1, &addStatement, NULL) != SQLITE_OK)
{
NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(tdatabase));
}
sqlite3_bind_text(addStatement, 0, [tUserName UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStatement, 1, [tLevel UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStatement, 2, [tUserName UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(addStatement))
{
NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(tdatabase));
sqlite3_reset(addStatement);
}
sqlite3_close(tdatabase);
}
@catch (NSException *r)
{
NSLog(@"Exception---- %@",r);
}
NSLog(@"insertDataIntoDatabase-----2");
}
答案 0 :(得分:1)
我必须承认我使用FMDB(SQLite包装器使我与SQLite函数隔离),但有几件事情看起来很奇怪:
如果你是sqlite3_prepare_v2()一个语句,你不需要你的sqlite3_finalize()吗?
看起来你在这里关闭数据库,但没有打开它。这似乎打开了sqlite3_open()语句和sqlite3_close()调用不平衡的可能性。您是否100%确信这不是问题?我会尝试在开放和结束的声明中加入NSLog,并确保它们是平衡的。
这两个问题的结合让我想知道你是不是指sqlite3_finalize()你当前有sqlite3_close()。
只是一些想法。
答案 1 :(得分:1)
此链接列出了可以触发数据库锁定错误的原因:
引用其中一个原因:
当SELECT在同一个表上处于活动状态时,尝试写入表。
由于您未在语句中调用sqlite3_finalize,因此先前的“SELECT”语句可能会阻止您的“INSERT”。在调用sqlite3_close之前尝试添加sqlite3_finalize。