【发布时间】:2010-07-15 01:31:44
【问题描述】:
我有一个简单的 iPhone 应用程序,它在启动时访问一些远程数据,然后要求用户选择一个已选择的选项,但是每次应用程序启动时都会发生这种情况,我希望应用程序记住该选择以供下次使用一段时间后,我如何使用 Core Data 持久化这个对象?
我对 Core Data 非常陌生,我认为这与向 NSManagedObjectContext 添加对象有关,但我不确定是否有办法将一个对象存储在一个键或其他东西上,以便我可以检查是否之前快速选择它以避免进行远程调用...
编辑
好的,似乎NSUserDefaults 是去这里的方式,但我有一个小问题,我的自定义类是扩展NSManagedObject,我听说在 NSUserDefaults 中存储一个实例有点困难,所以我写了一个小转换器,它获取类的每个属性并将其分别放在不同键下的 NSUserDefaults 中。
像这样:
-(void)saveDeviceForUser:(Device*) device
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedActive = [NSKeyedArchiver archivedDataWithRootObject:device.active];
[defaults setObject:encodedActive forKey:@"UsersDevice_Active"];
//and so on for each property of the Device object
}
然后我以类似的方式检索我的对象:
-(Device*)loadDeviceForUser
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedActive = [defaults objectForKey: @"UsersDevice_Active"];
NSNumber* unarchivedActive = (NSNumber*)[NSKeyedUnarchiver unarchiveObjectWithData: encodedActive];
Device *d = [[Device alloc] init];
d.active = unarchivedActive;
return d;
}
但是,当我到达d.active = unarchivedActive 上面的那一行时,我得到一个错误:
由于未捕获的异常“NSInvalidArgumentException”而终止应用,原因:“-[Device setActive:]: unrecognized selector sent to instance 0xac0be10”
我的类属性是使用@dynamic 而不是@synthesize 设置的,所以我是否必须实现setter 和getter 才能使其工作?这会以任何方式扰乱 Core Data 吗?
我希望这是有道理的
干杯, 标记
【问题讨论】:
-
你有 NSNumber* unarchivedActive,它可能需要是 NSNumber *unarchivedActive
-
宾果游戏!事实证明这里有很多问题,而且已经很晚了......愚蠢的复制和粘贴错误!感谢您提供的所有帮助:)
标签: iphone objective-c core-data