在通过核心数据获取数据的同时,自动再次插入已有的行
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