2014-09-26 45 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];是我的代碼丟失,非常感謝羅布您的幫助