奇怪的东西。我正在查询一个小的SQLite数据库。我希望得到它的随机结果。 它工作得很好,但在大约10-15次查询之后,我会遇到相同的结果。我显然必须遗漏一些东西,虽然我无法弄清楚是什么。 这里有一些代码向您展示我一遍又一遍地调用的方法:
-(NSString*)setBtnImage:(UIButton*) btn{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database.sqlite"];
NSString *result;
NSString *resultTemp;
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK){
const char *sql = "SELECT * FROM main ORDER BY RANDOM() LIMIT 1;";
sqlite3_stmt *searchStatement;
if(sqlite3_prepare_v2(database, sql, -1, &searchStatement, NULL) == SQLITE_OK){
while (sqlite3_step(searchStatement) == SQLITE_ROW) {
NSString *mot = [NSString stringWithUTF8String:(char *)sqlite3_column_text(searchStatement, 1)];
NSString *nom_fichier = [NSString stringWithUTF8String:(char *)sqlite3_column_text(searchStatement, 3)];
resultTemp = [mot stringByAppendingString:@" "];
result = [resultTemp stringByAppendingString:nom_fichier];
UIImage *image = [UIImage imageNamed:nom_fichier];
[btn setImage:image forState:UIControlStateNormal];
[btn setTitle:mot forState:UIControlStateNormal];
}
}
sqlite3_finalize(searchStatement);
}
return result;
}
因此,您可以看到我从数据库中获取文件名,以便知道要应用于按钮的文件。 就是这样。它很有效,直到我永远坚持相同的结果。 但是没有错误消息。
我正在使用Xcode 4.6
任何帮助表示感谢。
谢谢大家。
答案 0 :(得分:0)
尝试添加:
sqlite3_close(database);
之后
sqlite3_finalize(searchStatement);
在玩了一段时间后,我在一段时间后再次重新打开数据库时出现了一个奇怪的SQLITE_PROTOCOL错误。该错误意味着数据库已被锁定。事实证明,如果数据库在使用后没有关闭,就会发生这种情况。您编写例程的方式从未关闭数据库,但每次都重新打开它。因为没有太多的错误处理,它可能看起来只是你再次获得相同的结果。因为如果发生错误,您只需不要设置新的按钮图像。虽然我必须说我必须打开并且不经常关闭数据库而不仅仅是10-15次。我有一个循环读取随机数25次,当我进入后台并且当我进入前景时,我这样做了。所以它发生在大约250次之后。
但是,您必须做的是添加一些错误记录,以便您可以轻松查看正在发生的事情。所以在你的代码中添加一些其他分支并对其进行NSLog。
我修改过的测试版本如下所示:
-(NSString*)setBtnImage
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database2.sqlite"];
NSString *result;
// NSString *resultTemp;
sqlite3 *database;
int rc = sqlite3_open([path UTF8String], &database) ;
if (rc == SQLITE_OK){
const char *sql = "SELECT id FROM log ORDER BY RANDOM() LIMIT 1;";
sqlite3_stmt *searchStatement;
int rc = sqlite3_prepare_v2(database, sql, -1, &searchStatement, NULL) ;
if(rc == SQLITE_OK){
if (sqlite3_step(searchStatement) == SQLITE_ROW) {
int r=sqlite3_column_int(searchStatement, 0);
result = [NSString stringWithFormat:@"%i",r];
} else {
result = @"nothing";
}
sqlite3_finalize(searchStatement);
} else {
NSLog(@"rc=%i",rc);
}
sqlite3_close(database);
} else {
NSLog(@"could not open rc=%i",rc);
}
return result;
}