通过核心数据获取数据时,再次自动插入现有行

时间:2016-02-19 17:00:13

标签: ios objective-c core-data nsfetchrequest nsmanagedobjectmodel

我是核心数据的新手。我试图以面向对象的方式实现它。作为一个示例项目,我创建了一个View Controller,它通过核心数据显示来自sqlite数据库的数据,并且数据由另一个viewController输入。 但是,我想处理数据提取和插入模型类," ContextHandler"我创建了另一个模型类" Device"这是NSManagedObject的子类。

但是,在获取数据时,我将重新输入先前输入的数据。

这是我的故事板 - 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类。

我做不到 -

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

如果我这样做,应用程序崩溃了。 任何人都可以帮助我。

2 个答案:

答案 0 :(得分:0)

你不需要这个

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

因为 将新对象插入托管对象上下文

您的数据将以Device

的形式返回到deviceList数组中

答案 1 :(得分: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
}

当您在模型中指定时,fetch会返回类型为Device的对象。

请注意,返回类型是普通数组,而不是NSMutableArray