Sqlite"其中"声明不写入NSMutableArray

时间:2014-09-26 10:14:15

标签: ios sqlite uipickerview

任何人都可以提供帮助,我正在尝试使用WHERE语句从SQLite DB&写入NSMutableArray,以便用户可以从UIPickerView中选择减少数量的数据,只需使用选择器选择区域,然后SELECT语句查看UITextField与他们选择的区域&挑选这个地区的商店。

如果我使用下面的代码,我在选择器中没有数据,如果我将结果减少到一个答案&将结果写入UITextField我得到数据,如果我删除了WHERE语句,我在选择器中获取数据,但是DB中的每个商店,而不仅仅是区域中的数据。

- (void) findStoreName{ storeFullName = [[NSMutableArray alloc]init];
    const char *dbpath_rm1 = [databasePath UTF8String];
    sqlite3_stmt *statementrm1;
    if (sqlite3_open(dbpath_rm1, &storeData) == SQLITE_OK) {
        NSLog(@"RM Names db opened");
        NSString *querySQLPrm1 = [NSString stringWithFormat:@"SELECT Store1,Store2 FROM storeNames WHERE RM_N=\"%@\"",rmName.text];
        const char *query_stmtrm = [querySQLPrm1 UTF8String];
        if (sqlite3_prepare_v2(storeData, query_stmtrm, -1, &statementrm1, NULL) == SQLITE_OK)
            while (sqlite3_step(statementrm1) == SQLITE_ROW) {
                NSString *rm1 = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statementrm1, 0)];
                NSString *rm2 = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statementrm1, 1)];
                NSString *str = [[NSString alloc]initWithFormat:@"%@",rm1];
                [storeFullName addObject:str];

                NSString *str2 = [[NSString alloc]initWithFormat:@"%@",rm2];
                 [storeFullName addObject:str2];}
        sqlite3_finalize(statementrm1);
    }
    sqlite3_close(storeData);NSLog(@"RM Names db Closed");
}

更新

这是调用上述方法的IBAction代码:

- (IBAction)acessdbStore:(id)sender {
    [self findStoreName]; 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 
    dbStoreview.frame = CGRectMake(300, 430, 380, 288);
    [UIView commitAnimations]; 
} 

3 个答案:

答案 0 :(得分:0)

SELECT Store1,Store2 FROM storeNames WHERE RM_N LIKE \"%@\"
你试过这个吗?而不是RM_N = \"%@ \"

答案 1 :(得分:0)

使用调用此findStoreName的代码更新了问题,问题是完成检索数据后,必须指示选择器视图调用datasource / delegate方法来重新加载数据:

[self.dbStorepicker reloadAllComponents]; 

如果没有看到表中的示例数据,并且看到调用此函数的代码,我们就无法说出准确的行为。

但话说回来,如果这个代码遇到任何问题,它会在没有提供任何有意义的诊断信息的情况下无声地失败。如果这些SQL调用中的任何一个失败,我建议记录(a)返回代码rc; (b)sqlite3_errmsg()

- (void) findStoreName{
    NSMutableArray *storeFullName = [[NSMutableArray alloc]init];
    int rc;
    const char *dbpath_rm1 = [databasePath UTF8String];
    sqlite3_stmt *statementrm1;
    if ((rc = sqlite3_open(dbpath_rm1, &storeData)) != SQLITE_OK) {
        NSLog(@"open failed (%ld)", (long)rc);
        return;
    }

    NSLog(@"RM Names db opened");
    const char *query_stmtrm = "SELECT Store1,Store2 FROM storeNames WHERE RM_N=?";
    if ((rc = sqlite3_prepare_v2(storeData, query_stmtrm, -1, &statementrm1, NULL)) != SQLITE_OK) {
        NSLog(@"prepare failed: %s (%ld)", sqlite3_errmsg(storeData), (long)rc);
    } else if (sqlite3_bind_text(statementrm1, 1, [rmName.text UTF8String], -1, NULL) != SQLITE_OK) {
        NSLog(@"bind failed: %s (%ld)", sqlite3_errmsg(storeData), (long)rc);
        sqlite3_finalize(statementrm1);
    } else {
        while ((rc = sqlite3_step(statementrm1)) == SQLITE_ROW) {
            NSString *rm1 = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statementrm1, 0)];
            NSString *rm2 = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statementrm1, 1)];
            NSString *str = [[NSString alloc]initWithFormat:@"%@",rm1];
            [storeFullName addObject:str];

            NSString *str2 = [[NSString alloc]initWithFormat:@"%@",rm2];
            [storeFullName addObject:str2];
        }
        if (rc != SQLITE_DONE) {
            NSLog(@"step failed: %s (%ld)", sqlite3_errmsg(storeData), (long)rc);
        }
        sqlite3_finalize(statementrm1);
    }
    sqlite3_close(storeData);
    NSLog(@"RM Names db Closed");
}

注意,我还删除了stringWithFormat来构建SQL,而是使用了?占位符。然后我将文本值绑定到? sqlite3_bind_text()。这可能与您当前的问题无关,但对于使您的SQLite代码更加健壮非常重要。 (现在,如果文本字符串包含引号,则SQL将失败。)

主要观察是,如果您的任何SQLite调用失败,请记录有意义的错误消息。

答案 2 :(得分:0)

[self.dbStorepicker reloadAllComponents];是我遗失的代码,非常感谢Rob的帮助