在一些随机选择查询后坚持相同的结果

时间:2013-05-16 19:45:41

标签: ios objective-c sqlite

奇怪的东西。我正在查询一个小的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

任何帮助表示感谢。

谢谢大家。

1 个答案:

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