При получении данных через основные данные, автоматически вставляя существующие строки снова
Я новичок в основных данных. Я пытаюсь реализовать это объектно-ориентированным способом. В качестве примера проекта я создал 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
,