我是核心数据的新手。我试图以面向对象的方式实现它。作为一个示例项目,我创建了一个View Controller,它通过核心数据显示来自sqlite数据库的数据,并且数据由另一个viewController输入。
但是,我想处理数据提取和插入模型类," ContextHandler"我创建了另一个模型类" Device"这是NSManagedObject
的子类。
但是,在获取数据时,我将重新输入先前输入的数据。
我的实体模型类名为" 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];
如果我这样做,应用程序崩溃了。 任何人都可以帮助我。
答案 0 :(得分:0)
你不需要这个
//here I am inserting the data again
Device *deviceObject = [[Device alloc] initWithEntity:entity insertIntoManagedObjectContext:self.context];
因为 将新对象插入托管对象上下文
您的数据将以Device
答案 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
。