2011-10-07 4 views
0

그래, 아티스트라는 행의 모든 ​​엔트리를 SQLite 데이터베이스에서 검색하고있다.하지만 같은 아티스트가 두 번 나타나기를 원하지 않는다. ...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 * 아티스트 그룹을 그림에서는

2

왜 SQL 엔진에 작업을 허용하지 않습니까? 선별 된 별개의

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 소리 나는 필요한 것처럼 같은 효과가 있었다 ... 그러나 그것은 나에게 약간의 문제를주고있다. 내가 회화에서 SELECT DISTINCT Artist를한다면, 나는 단 하나도 얻지 못한다. queId, 그래서 나는 오직 Artist를 검색하는 새로운 쿼리를 만들려고했다. 그래서 SELECT * FROM Painting에서 모든 아티스트를 얻는다. 그래서 DISTINCT를 추가하려고 했으므로 SELECT DISTINCT Artist FROM 그림을 그리지 만 NSString * 아티스트 라인에서 "Thread 1 : Program received signal SIGBART"가 발생하고 오류가 발생합니다. – user969043

+0

좋아요, 이렇게 다른 방법이 있습니다 : @ "SELECT * FROM GROUP BY GROUP BY ARTIST"; - 작동하는 것 같습니다. DISTINCT를 작동시키고 싶지만, 앞으로 어떻게 할 것인지를 알고 있습니다. – user969043