2011-10-07 64 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