如何从sqlite中提取名称搜索数据?

时间:2012-02-03 13:59:12

标签: database sqlite search prepared-statement

我遵循了有关创建sqlite数据库,向其中插入数据和从中搜索数据以及使用以下方法从该数据库中提取数据的教程:

-(IBAction)findContacts{

    const char *dbpath = [databasePath UTF8String];
    sqlite3_stmt *statement;
    if (sqlite3_open(dbpath, &contactDB)==SQLITE_OK) {
        NSString *querySQL = [NSString stringWithFormat:@"SELECT adress, phone FROM CONTACTS WHERE name = \"%@\"", [name text]];
        status.text = querySQL;         
        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK) {
            if (sqlite3_step(statement)==SQLITE_ROW) {

                NSString *adressField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];
                adress.text = adressField;

                NSString *phoneField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];
                phone.text = phoneField;

                status.text = @"Match Found";

                [adressField release];
                [phoneField release];} 

                    status.text = @"Match not Found";
                    adress.text = @"";
                    phone.text = @"";
            sqlite3_finalize(statement);}
        sqlite3_close(contactDB);}}

当我编译时,没有错误!没注意!但不起作用......

我发现的是因为

sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)

不平等,代码没有进入如果statemens。我发现当我用

扭转了这个状况
sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) != SQLITE_OK)

并在status.text看到“找不到匹配”。但仍然无法在里面找到真正的联系。

您是否意识到代码有问题?

提前致谢...

1 个答案:

答案 0 :(得分:1)

除非'sqlite3_prepare_v2'的结果实际上是SQLITE_OK,否则你真的不想进入该块。

将等式要求更改为'!='是一个有趣的诊断,但显然不是应该永久保留在测试代码中的更改。

既然我们知道sqlite3_prepare_v2没有返回成功的代码,那么要问的问题是:它返回的代码是什么?

根据文档,它必须返回此处显示的代码之一:

http://sqlite.org/c3ref/c_abort.html

您还可以使用'sqlite3_errmsg'来获取字符串表示。请参阅:http://sqlite.org/c3ref/errcode.html