【问题标题】:whats the best way to store a single object in core data for a user为用户将单个对象存储在核心数据中的最佳方法是什么
【发布时间】: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


【解决方案1】:

我会使用 NSUserDefaults 存储对象

存储自定义对象时,必须正确archive

【讨论】:

  • 另一个例子是使用自定义NSMutableDictionary
  • @dylan,谢谢 我会试一试,让你知道,但快速的问题,你是说要在 NSUserDefaults 中存储一个对象,我需要定义它是如何获取的连载? @tadman 我需要在应用程序运行时持久化对象
  • 要将内容存储在NSUserDefaults 中,需要将它们分解为“标准”对象、字符串、数字、日期、字典、数组等。或者您需要将其转换为二进制数据。将其存储为标准对象更容易。
  • 非常感谢到目前为止的帮助,我已经更新了问题请帮我看看?
  • 好的,现在全部排序,结果 NSUserDefaults 非常易于使用,我的错误是一个新手错误 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2011-01-24
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
相关资源
最近更新 更多