2011-10-07 40 views
0

好吧,我正在SQLite數據庫中搜索名爲Artists的行中的所有條目...但我不希望同一個藝術家出現兩次...iOS:根據以前的條目篩選SQLite查詢/檢查條目

-(NSArray *)findAllArtists 
{ 
    NSMutableArray *returnArray = [[[NSMutableArray alloc] init] autorelease]; 

    NSString *query = @"SELECT * FROM Painting"; 

    sqlite3_stmt *statement; 

    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) 
    == SQLITE_OK) 
    {   
     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 
      char *uniqueIdChars = (char *) sqlite3_column_text(statement, 0); 
      char *artistChars = (char *) sqlite3_column_text(statement, 1); 
      NSString *uniqueId = [[NSString alloc] initWithUTF8String:uniqueIdChars]; 
      NSString *artist = [[NSString alloc] initWithUTF8String:artistChars]; 

      PaintingInfo *info = [[PaintingInfo alloc] initWithUniqueId:uniqueId artist:artist]; 
      [returnArray addObject:info]; 

      [uniqueId release]; 
      [artist release]; 
     } 

     sqlite3_finalize(statement); 
    } 

    sqlite3_close(database); 
    return returnArray;  
} 

所以,我在想什麼是一個辦法可能是把結果加到了returnArray,我在那裏檢查,如果它以前的結果一致之前裏面使用循環......這聽起來相當簡單,但由於某種原因,我沒有得到我嘗試工作的循環(認爲我可能沒有睡眠工作太久,所以我盲目地主演我的錯誤)... 然後再次,我對SQLite相當陌生,所以它可能是一種很糟糕的方式去實現它...

有什麼建議嗎?

回答

0

SELECT * FROM繪畫GROUP BY藝術家有同樣的效果一樣

2

爲什麼不讓sql引擎做這項工作?做一個SELECT DISTINCT

http://www.sqlite.org/lang_select.html

例如:

SELECT DISTINCT artist FROM Painting 

如果由於某種原因,你需要做的是在代碼迴路爲你處理,你可以看看的NSSet這是一個哈希集合。在處理過程中,您可以將每個藝術家添加到集合中,並在處理之前檢查集合中是否存在。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/Reference.html

例如,這樣的:

NSArray *artists = [NSArray arrayWithObjects:@"bob", @"jane", @"jane", nil]; 

NSMutableSet *distinctArtists = [[NSMutableSet alloc] init]; 
NSMutableArray *list = [[NSMutableArray alloc] init]; 
for (NSString* artist in artists) 
{ 
    if (![distinctArtists containsObject:artist]) 
    { 
     [distinctArtists addObject:artist]; 
     [list addObject:artist]; 
    } 
} 

// print 
for (NSString *artist in list) 
{ 
    NSLog(@"artist: %@", artist); 
} 

輸出:

2011-10-06 22:51:16.457 Craplet[1982:707] artist: bob 
2011-10-06 22:51:16.459 Craplet[1982:707] artist: jane 
+0

DISTINCT聲音,我需要什麼......但它給我帶來了一些麻煩......如果我選擇了「從繪畫中選擇不同的藝術家」,我不會得到單身queId,所以我嘗試創建一個新的查詢,在那裏我只搜索Artist ...所以,如果我做了SELECT * FROM繪畫,我得到了所有的藝術家...所以我嘗試添加DISTINCT,所以它是SELECT DISTINCT Artist FROM繪畫......但它然後產生和我的NSString *藝術家行錯誤,說:「線程1:程序接收到的信號SIGBART」 – user969043

+0

好吧,所以找到了另一種方式:@「SELECT * FROM Painting GROUP BY Artist」; - 似乎工作...雖然我想讓DISTINCT工作,但我知道將來如何 – user969043