0

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

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

Вот мой storyboards- enter image description here

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

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 *deviceObject = [[Device alloc] init]; 

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

+0

Вы просто хотите отредактировать объект устройства вместо создания нового? Правильно ли я задаю вопрос? – audience

+0

Нет, я просто хочу, чтобы объекты в качестве объекта устройства отображались в моей таблице. Когда я извлекаю, я получаю объект NSManagedObject, а не тип устройства.Итак, я хочу получить объект в Тип устройства. Не требуется редактирования. – Natasha

+0

Если вы указали 'Device' как класс для объекта' Device' в редакторе модели данных, то выборка вернет массив объектов 'Device'. Вы должны просто использовать, например, 'Device * firstDevice = devices [0];'. Следовательно, не нужно, чтобы ваш цикл создавал объекты 'Device' из' NSManagedObjects' – pbasdf

ответ

0

Вам не нужен этот бит

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

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

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

+0

Нет, он возвращает NSManagedObject – Natasha

0

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

-(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.

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

  • Нет связанных вопросов^_^