Базовые данные (Mac) Как реализовать автоинкремент в поле идентификатора - PullRequest
3 голосов
/ 19 января 2011

Мне было интересно, может ли кто-нибудь указать мне, как настроить автоинкремент для атрибута в сущности coredata.Я знаю, что индексированный флажок просто делает поле индексированным для скорости поиска и поиска.

Я также знаю, что мне придется делать это в коде, но я не уверен, как получить последний / самый высокийID для установки идентификатора новых объектов.Я нашел, как это сделать несколько лет назад, но не могу найти это снова.

У меня очень ограниченные познания в Objective-C и тем более в coredata.Также, если кто-то может предложить, как убедиться, что поле уникально, например, поле имени, это было бы здорово.

Мой код здесь , если вы хотите посмотретьна то, что я сделал до сих пор.Проект представляет собой базовую базу данных, которая содержит детали и их расположение, а также инструменты.Это только частично закончено, в основном небольшая база данных для моего электронного комплекта.Я уверен, что есть приложения, которые будут делать это, но всегда лучше, когда вы делаете это сами

Ответы [ 2 ]

1 голос
/ 23 января 2011

Вот как Apple реализовала автоинкремент:

 - (void) awakeFromInsert
     {
    [super awakeFromInsert];
    static int tempID = 0;
    [self setValue:[NSNumber numberWithInt:++tempID] forKey:@"id"];
}
1 голос
/ 19 января 2011

Я не совсем уверен, что идентификатор делает в вашем приложении, но мое первое наблюдение состоит в том, что все сущности в вашей модели данных имеют как имя, так и идентификатор, поэтому они, вероятно, должны иметь абстрактную супер-сущность для хранения.имя и идентификаторКроме этого, вы можете получить максимальный идентификатор в наборе, подобном этому:

Category *cat = /* get a category  */;
NSSet *parts = cat.parts;
NSNumber *maxID = [parts valueForKeyPath:@"@max.id"];

для идентификаторов категории, вы можете выполнить запрос выборки для всех категорий, а затем использовать эту технику для массива, которыйвозвращаетсяЯ не знаю, хотите ли вы сохранить идентификаторы каждого объекта модели уникальными или хотите, чтобы идентификаторы начинались с 0 для первого объекта, добавленного к каждой сущности.

Чтобы убедиться, что поле уникально, вы можете использоватьпроверка управляемого объекта.это описано в Руководстве по программированию основных данных и более подробно в Руководстве по реализации объекта модели.Чтобы убедиться, что имя уникально, вам нужно проверить его на соответствие всем именам в validateName: error: метод.создание абстрактной супер сущности сделает это намного проще.Для этого вы получаете все имена объектов в абстрактной супер сущности и проверяете их по значению, которое нужно проверить.

Редактировать: если вы используете абстрактную супер сущность, вы должны получить максимальный идентификатор объектовв абстрактной супер сущности, если вы хотите, чтобы они были уникальными.Также, как кто-то еще указал, objectID управляемого объекта является уникальным идентификатором для него, который всегда будет одинаковым, но, глядя на приложение, я не думаю, что это действительно то, что вам нужно, потому что это будут номера компьютеров, а неболее дружественные результаты увеличения максимального идентификатора при создании нового объекта.Еще одна вещь, вы должны установить идентификатор объекта в awakeFromInsert, чтобы он вызывался только при создании объекта.

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