2014-09-26 48 views
0

任何人可以帮助,我试图用一个WHERE语句来选择一个SQLite数据库&写数据到NSMutableArray,使用户可以从一个UIPickerView选择减少数据量,简单地他们使用选取器来选择区域,然后SELECT声明查看UITextField与他们选择的区域&挑选该区域中的商店。sqlite的“其中”声明不写的NSMutableArray

如果我使用下面的代码,我没有得到任何数据在选择器,如果我减少结果一个答案&结果写入一个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

你初始化你的NSMutableArray? – 2014-09-26 10:39:27

+0

我有一个快速冲浪来理解你的问题,答案是否定的,这是所有表格阵列所需的?因为正如我所说,如果我删除了Where语句的NSMutableArray数据填充,代码应该看起来像什么时候应该去,非常感谢 – 2014-09-26 10:50:59

+0

我的意思是做storeFullName = [[NSMutableArray alloc] init];在添加任何objects.btw之前,如果它被填充,如果你删除where语句,那么这意味着你正在初始化它的某个地方。所以问题出在哪里。考虑做WHERE RM_N ='%@'而不是WHERE RM_N = \“%@ \” – 2014-09-26 10:57:24

回答

0

用代码调用findStoreName更新了问题后,问题是当完成检索数据时,必须指示您的选择器视图调用数据源/委托方法以重新加载数据:

[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调用失败时记录有意义的错误消息。

+0

感谢您花时间做出回应,我会对您提出的更改进行修改,我添加了日志代码并且正确的结果已经被记录下来,所以我想知道是否是时间问题,即选择器显示速度比MSMutableArray结果? – 2014-09-27 13:38:08

+0

NSLog(@“storeFullName:%@”,storeFullName); – 2014-09-27 13:38:47

+0

@CoreyPowell上面的'findStoreName'会填充数组。所以,在调用'findStoreName'之后,你是否调用了选择器的'reloadAllComponents'? – Rob 2014-09-27 13:45:03

0
SELECT Store1,Store2 FROM storeNames WHERE RM_N LIKE \"%@\" 

你试过吗?代替RM_N = \“%@ \”

0

[self.dbStorepicker reloadAllComponents];是我的代码丢失,非常感谢罗布您的帮助