При получении данных через основные данные, автоматически вставляя существующие строки снова

Я новичок в основных данных. Я пытаюсь реализовать это объектно-ориентированным способом. В качестве примера проекта я создал View Controller, который показывает данные из базы данных sqlite через данные ядра, а данные вводятся другим viewController. Однако я хотел обработать выборку и вставку данных через класс модели "ContextHandler", и я создал другой класс модели "Устройство", который является подклассом NSManagedObject,

Однако при извлечении данных я повторно ввожу ранее введенные данные.

Вот мои раскадровки

Мой класс модели сущности называется "Устройство".

Device.h -

#import <CoreData/CoreData.h>

@interface Device : NSManagedObject

@property(nonatomic, strong) NSString *name;
@property(nonatomic, strong) NSString *company;
@property(nonatomic, strong) NSString *version;

@end

и Device.m -

#import "Device.h"

@implementation Device

@dynamic name;
@dynamic company;
@dynamic version;

@end

Через следующий класс я вставляю и извлекаю объект устройства.

Метод вставки

-(void)addDeviceWithName:(NSString*)name andCompany:(NSString*)company andVersion:(NSString*)version{

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Device" inManagedObjectContext:self.context];

    Device *newDevice = [[Device alloc] initWithEntity:entity insertIntoManagedObjectContext:self.context];
    newDevice.name = name;
    newDevice.company = company;
    newDevice.version = version;

    NSError *error = nil;

    if(![self.context save:&error]){
        NSLog(@"Could not add due to %@ %@", error, [error localizedDescription]);
    }
}

и метод извлечения -

-(NSMutableArray*)getDeviceListFromDatabase{
     NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Device"];
    NSMutableArray *devices = [[self.context executeFetchRequest:fetchRequest error:nil] mutableCopy];

    NSMutableArray *deviceList =[[NSMutableArray alloc]initWithCapacity:[devices count]];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Device" inManagedObjectContext:self.context];

    for(NSManagedObject *currentDevice in devices){
       //here I am inserting the data again
        Device *deviceObject = [[Device alloc] initWithEntity:entity insertIntoManagedObjectContext:self.context];

        deviceObject.name = [currentDevice valueForKey:@"name"];
        deviceObject.company = [currentDevice valueForKey:@"company"];
        deviceObject.version = [currentDevice valueForKey:@"version"];

        [deviceList addObject:deviceObject];
    }
    return deviceList;
}

Дело в том, что пока я инициализирую объект устройства, я заканчиваю тем, что снова добавляю объект в базу данных.

Как решить эту проблему. Как инициализировать класс Device, не вставляя данные снова.

Я не мог сделать -

Device *deviceObject = [[Device alloc] init];

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

2 ответа

Вам не нужно это немного

//here I am inserting the data again
Device *deviceObject = [[Device alloc] initWithEntity:entity insertIntoManagedObjectContext:self.context];

потому что это действительно вставка новых объектов в контекст управляемых объектов

Ваши данные будут возвращены в массиве deviceList как Device

Это должно исправить вашу проблему:

-(NSArray *)getDeviceListFromDatabase {
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Device" inManagedObjectContext:self.context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    NSError *error;
    NSArray *array = [self.context executeFetchRequest:request error:&error];
    // Error handling.
    return array; // This is your array of Device objects
}

Выборка возвращает объекты вашего типа Device когда вы указали это в вашей модели.

Обратите внимание, что тип возвращаемого значения - это обычный массив, а не NSMutableArray,

Другие вопросы по тегам