在通过核心数据获取数据的同时,自动再次插入已有的行

Posted

技术标签:

【中文标题】在通过核心数据获取数据的同时,自动再次插入已有的行【英文标题】:While fetching Data through core data, automatically inserting the existing rows again 【发布时间】:2016-02-19 17:00:12 【问题描述】:

我是核心数据的新手。我正在尝试以面向对象的方式实现它。作为一个示例项目,我创建了一个视图控制器,它通过核心数据显示来自 sqlite 数据库的数据,并且数据由另一个视图控制器输入。 但是,我想通过模型类“ContextHandler”处理数据获取和插入,并创建了另一个模型类“Device”,它是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];

如果我这样做,应用程序就会崩溃。 谁能帮帮我。

【问题讨论】:

您只想编辑设备对象而不是创建新对象吗?我没听错你的问题吗? 不,我只想将对象作为设备对象显示在我的表中。当我获取时,我得到 NSManagedObject,而不是设备类型对象。所以,我想获取设备类型的对象。无需编辑。 如果您在数据模型编辑器中将Device 指定为Device 实体的类,则提取将返回Device 对象的数组。例如,您应该能够使用Device *firstDevice = devices[0];。因此,您的循环无需从 NSManagedObjects 构建 Device 对象 【参考方案1】:

你不需要这个位

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

因为真正将新对象插入到托管对象上下文中

您的数据将在 deviceList 数组中返回为Device

【讨论】:

不,它返回 NSManagedObject【参考方案2】:

这应该可以解决您的问题:

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

【讨论】:

以上是关于在通过核心数据获取数据的同时,自动再次插入已有的行的主要内容,如果未能解决你的问题,请参考以下文章

Android Room - 通过自动生成获取新插入行的 id

当向Oracle数据库中插入数据时,如何获取行ID

通过 Alamofire,想获取数据并将其插入 TableView,但在完成插入之前,TableView 已加载

如何在核心数据swift 3中同时保存和获取

根据特定条件从表中获取已插入数据的插入查询

使用 PDO 插入时获取自动递增行 ID [重复]