任何人都可以提供帮助,我正在尝试使用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];
}
答案 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的帮助