我正在使用sqlite数据库存储我的数据。但是在插入查询时显示“数据库被锁定”的错误。这是我的代码
sqlite3_stmt *statement;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
const char *dbpath = [[defaults objectForKey:@"dbpath"] UTF8String];
if (sqlite3_open(dbpath, &studentDB22) == SQLITE_OK)
{
NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO Emotion_videos (name) VALUES (\"%@\")",filePath];
const char *query_stmt = [insertSQL UTF8String];
if (sqlite3_prepare_v2(studentDB22, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
NSLog(@"shi h2345");
if (sqlite3_step(statement) == SQLITE_ROW)
{
printf( "could not prepare statement: %s\n", sqlite3_errmsg(studentDB22));
}
}
sqlite3_finalize(statement);
}
else
{
printf( "could not prepare statement: %s\n", sqlite3_errmsg(studentDB22));
}
我可以插入两到三次数据但是当它再次运行时,它会显示数据库锁定错误。
答案 0 :(得分:2)
您打开数据库但不关闭它。
您不应使用字符串格式来创建查询。你应该放?然后查询中的占位符绑定适当的值。这样可以处理正确引用和转义字符串值等问题。
NSString *insertSQL = @"INSERT INTO Emotion_videos (name) VALUES (?)";
准备语句后,调用sqlite3_bind_text
绑定字符串值。
另外。请勿使用sqlite3_open
,请使用sqlite3_open_v2
。它会更好,并为您提供更多控制。
答案 1 :(得分:0)
创建数据库连接时,您错过了重要的一步: -
如果已建立连接,请在创建连接之前关闭数据库连接。
if (sqlite3_open([[self dataFilePath] UTF8String], &database)
!= SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Failed to open database");
}
在功能结束时使用: -
sqlite3_close(database);