2013-12-18 2 views
0

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

- (void)unlockNextLevel 
{ 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *levelEntity = [NSEntityDescription entityForName:@"Level" 
                inManagedObjectContext:[self managedObjectContext]]; 
    [fetchRequest setEntity:levelEntity]; 

    int nextLevelPosition = [self.position intValue] + 1; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat: 
           [NSString stringWithFormat:@"position == %i", 
           nextLevelPosition]]; 
    [fetchRequest setPredicate:predicate]; 

    NSError *error; 

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

    if (error) { 
     NSLog(@"%@", error.description); 
    } 

    if (result.count > 0) { 
     Level *nextLevel = result[0]; 

     nextLevel.locked = [NSNumber numberWithBool:NO]; 

     [self saveContext]; 
    } 
} 

Здесь я принести объект по значению его положение, которым должен быть уникальным (по соглашению), а затем изменить его «заперта» собственность. Я ожидаю, что он обновится, но основные данные вставляют новую запись ...

Объект, который я обновляю, имеет отношение к миру, в котором он находится. Таким образом, у мира много уровней, и уровень имеет только один мир.

Я думаю, что стоит упомянуть, что запись, вставленная в SQLite, не имеет ссылки на World (id of world is null).

Надеюсь, вы можете мне помочь.

ответ

1

Следующая строка, в которой создается новый объект «Уровень».

NSEntityDescription *levelEntity = [NSEntityDescription entityForName:@"Level" 
               inManagedObjectContext:[self managedObjectContext]]; 

Я думаю, вы можете просто инициализирует выборки запроса, используя следующий код вместо:

NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:@"Level"]; 

и удалите следующую строку:

[fetchRequest setEntity:levelEntity]; 
+0

Это сделали. Благодаря! – OscarVGG

1

Попробуйте этот путь. Сначала выберите требуемый объект с некоторым уникальным значением атрибута, таким как articleID. Если вы получите объект как nil, тогда создайте новый экземпляр сущности или обновите его.

Entity * entityInstance = nil; 
entityInstance = [self fetchEntityForID:entityInstanceID inContext:context]; 

if (entityInstance == nil) 
{ 
entityInstance = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:context]; 
} 

-(Entity *)fetchEntityForID:(NSNumber *) articleID inContext:(NSManagedObjectContext *) writeContext 
{ 
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Entity"]; 
    NSPredicate * predicate = [NSPredicate predicateWithFormat:@"articleID == %@",articleID]; 
    [fetchRequest setPredicate:predicate]; 

    NSArray *fetchedArray = [writeContext executeFetchRequest:fetchRequest error:nil]; 
    if ([fetchedArray count] > 0) { 
     return [fetchedArray objectAtIndex:0]; 
    } 
    return nil; 
} 

Надеется, что это помогает :)

Смежные вопросы