Выбор уникальной метки для NSManagedObject в CoreData - PullRequest
1 голос
/ 21 июля 2011

Я ищу лучшую альтернативу для решения этой проблемы.

В модели CoreData у меня есть NSManagedObject с именем Project.В его подклассе я переопределяю метод доступа (сеттер) для его атрибута метки.Здесь я проверяю, используется ли уже тот же ярлык.Если это так, я добавляю подчеркивание и число к метке, например, «MyProject» переименовывается в «MyProject_1».Конечно, я также должен проверить, нахожу ли я метку «MyProject» или «MyProject _» + номер.Я делаю это с регулярным выражением.

NSString *regexString = [NSString stringWithFormat:@"%@_[0-9]+", value];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(label = %@) OR (label MATCHES %@)", value, regexString];
[request setPredicate:predicate];

Затем я проверяю, сколько результатов получено, скажем, 5, поэтому я знаю, что следующий должен называться «MyProject_6».

Работает нормально, но, вероятно, у вас естьуже заметил, что есть небольшая проблема с этим кодом: что произойдет, если у меня есть следующие метки:

MyProject_1, MyProject_2, MyProject_3

, и пользователь решает вызвать проект MyProject_55.Тогда мой поиск извлек бы 4 элемента, и следующий проект был бы помечен MyProject_5 вместо MyProject_4.И что еще хуже, в какой-то момент у меня будет два MyProject_55.Я знаю, что это вряд ли произойдет, но может:).

Есть идеи для чего-то лучшего?

Вот метод доступа

#pragma mark - Setter for label

- (void)setLabel:(NSString *)aLabel
{
    if ([[self primitiveValueForKey:@"label"] isEqualToString:aLabel]) 
    {
        return;
    }

    NSMutableArray *objects = [self fetchObjectsWithValueEqualTo:aLabel];
    NSUInteger objectsCount = [objects count];

    aLabel = objectsCount > 0 ? [NSString stringWithFormat:@"%@_%d",aLabel, objectsCount] : aLabel;

    [self willChangeValueForKey:@"label"];
    [self setPrimitiveValue:aLabel forKey:@"label"];
    [self didChangeValueForKey:@"label"];
}

1 Ответ

0 голосов
/ 21 июля 2011

Это немного дороже, но самый простой выход из этой дилеммы, когда вы получаете новое решение для ярлыка «MyLabel_4», перепроверьте, если этот ярлык существует в магазине.

Промойте и повторяйте, пока у вас не появится действительно уникальный ярлык. Базовые данные очень эффективны, поэтому это не имеет значения в случае пользовательского пространства.

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