iOS: отфильтровать запрос SQLite / проверить запись по предыдущим записям - PullRequest
0 голосов
/ 07 октября 2011

Хорошо, поэтому я выполняю поиск в базе данных SQLite для всех записей в строке с именем Artists ... Но я не хочу, чтобы один и тот же исполнитель появлялся дважды ...

-(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;    
}
* 1003Итак, я думаю, что одним из способов может быть использование цикла внутри перед добавлением результата в returnArray, где я проверяю, соответствует ли он предыдущему результату ... Звучит довольно просто, но по какой-то причине яне получил циклы, которые я пытался работать (думаю, что я мог работать слишком долго без сна, поэтому я слепо смотрю на свои ошибки) ... Опять же, я довольно плохо знаком с SQLite, так чтоможет быть плохой способ сделать это ...

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Почему бы не позволить движку 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 голосов
/ 11 октября 2011

SELECT * FROM Painting GROUP BY Artist имел тот же эффект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...