Автоинкрементный идентификатор объекта в базовых данных? - PullRequest
6 голосов
/ 16 июня 2011

Я работаю с несколькими NSManagedObject типами с несколькими взаимосвязями. Как я могу сказать Core Data для автоматического заполнения идентификаторов объектов для меня? Я ищу что-то вроде индексного ключа в SQL, так что никакие два экземпляра данного объекта не могут иметь одинаковый идентификатор.

Edit:

Мне бы хотелось, чтобы на всех моих объектах "Учетной записи" были уникальные идентификаторы. Я просто добавлял один в `countForFetchRequest, но я понял, что при удалении второго до последнего объекта и последующем добавлении одного, последние два объекта теперь имеют одинаковые идентификаторы.

Как я могу убедиться, что данное значение имеет уникальное значение для всех экземпляров NSManagedObject "Account"?

РЕДАКТИРОВАТЬ2:

Мне нужен отдельный идентификатор для сортировки.

Ответы [ 4 ]

10 голосов
/ 16 июня 2011

Все NSManagedObjects автоматически имеют уникальный NSManagedObjectID.Нет никакого понятия о пользовательском атрибуте с автоинкрементом, но его легко написать самостоятельно.

4 голосов
/ 17 июня 2011

Я решил это с помощью агрегатов Core Data.Я фактически заканчиваю тем, что назначал удостоверение личности самостоятельно.

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

//
//  Create a new entity description
//

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:self.managedObjectContext];

//
//  Set the fetch request
//

NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:entity];

//
//  We need to figure out how many 
//  existing groups there are so that 
//  we can set the proper ID.
//
//  To do so, we use an aggregated request.
//

[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"entityID"]];

NSError *error = nil;

NSArray *existingIDs = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];


if (error != nil) {

    //
    //  TODO: Handle error.
    //

    NSLog(@"Error: %@", [error localizedDescription]);
}

NSInteger newID = 0;

for (NSDictionary *dict in existingIDs) {
    NSInteger IDToCompare = [[dict valueForKey:@"entityID"] integerValue];

    if (IDToCompare >= newID) {
        newID = IDToCompare + 1;
    }
} 

//
//  Create the actual entity
//

MyEntity *newEntity = [[MyEntity alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];

//
//  Set the ID of the new entity
//

[newEntity setEntityID:[NSNumber numberWithInteger:newID]];

//
//   ... More Code ...
//
3 голосов
/ 19 марта 2014

В соответствии с вашими EDIT2 и Edit3 вам поможет следующий ответ. Предположим, что в поле id указан NSNumber с unsignedInt в качестве ID.

1) Извлечь все записи для соответствующей сущности.

NSError *error = nil;
NSArray *array = [self fetchAllFileEntity:&error];

2) Найти максимальное число, относящееся к этому результату.

NSNumber *maxValue = nil;
if (array)
    maxValue = [array valueForKeyPath:@"@max.uniqueId.unsignedIntegerValue"];
else
    maxValue = [NSNumber numberWithUnsignedInteger:0];

3) Присвойте maxValue + 1 вашей новой сущности

entity.uniqueId = [NSNumber numberWithUnsignedInteger:maxValue.unsignedIntegerValue+1];
1 голос
/ 20 марта 2014

Я придумала это решение для указанной проблемы, надеюсь, оно кому-нибудь пригодится.

AppDelegate *appdelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = [appdelegate managedObjectContext];

NSError *error = nil;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *chatHist = [NSEntityDescription
                                     entityForName:@"ChatHistory" inManagedObjectContext:context];
[fetchRequest setEntity:chatHist];

int chatIdNumber = 0;

NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if ([fetchedObjects count] > 0) {
    ChatHistory *chatHistObj = [fetchedObjects objectAtIndex:[fetchedObjects count]-1];
    chatIdNumber = [chatHistObj.chatId intValue];
}

chatIdNumber = chatIdNumber+1;
ChatHistory *chat_History  = [NSEntityDescription          insertNewObjectForEntityForName:@"ChatHistory" inManagedObjectContext:context];

chat_History.chatId = [NSString stringWithFormat:@"%d",chatIdNumber];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...