当我们保存在 NSUserDefaults 中时,从核心数据和应用程序中获取“<NULL>”数据会崩溃?

Posted

技术标签:

【中文标题】当我们保存在 NSUserDefaults 中时,从核心数据和应用程序中获取“<NULL>”数据会崩溃?【英文标题】:Getting “<NULL>” data from core data and app crashed when we save in NSUserDefaults? 【发布时间】:2017-11-14 05:37:25 【问题描述】:

在应用程序版本 1.0 中,我的核心数据有 5 个属性,例如属性 1、属性 2、属性 3、属性 4、属性 5(所有属性类型都是可转换的)。它目前在 App Store 中可用。在应用程序版本 2.0 中,我更新了我的核心数据数据库。我又添加了一个属性,比如attribute6。我将核心数据版本从核心数据更改为核心数据2,并像这样在persistentStoreCoordinator中进行了更改。

NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

它工作正常,但在应用程序从 1.0 版更新到 2.0 版(首次安装新版本)时,我从属性 6 获取“NULL”数据(当我从数据库获取数据时),我正在尝试在 NSUserDefaults 中保存属性 6 数据,但应用程序崩溃并低于错误。

[User Defaults] Attempt to set a non-property-list object <null> as an NSUserDefaults/CFPreferences value for key MyKeyName
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object null for key MyKeyName'

【问题讨论】:

错误表明键 MyKeyName 的对象不是属性列表支持的类型之一。您需要使对象属性列表兼容。 对不起,我不明白... 属性列表支持NSStringNSNumberNSDataNSDate。您必须将 &lt;null&gt; 转换为受支持的类型之一。 好的,谢谢你的回复,我试试…… 【参考方案1】:

如果您希望它不为空,请确保在读取之前已将属性 6 的数据写入数据库。如果您只想在从 DB 读取后直接保存值,并允许属性 6 为空,那么您必须在尝试将其保存到 NSUserDefaults 之前检查 [NSNull null] 的值,NSUserDefaults 不接受 @ 987654325@ 个对象。

编辑: 从您的 cmets 来看,该值最初将是 [NSNull null]。所以你可以这样处理:

//assuming the object is named attribute
if (attribute != [NSNull null]) 
       [[NSUserDefaults standardUserDefaults] setObject:attribute forKey:MyKeyName];

【讨论】:

最初attribute6是空的,因为它是更新版本。 这就是为什么你在保存到NSUserDefaults时需要检查。 看看这里:developer.apple.com/library/content/documentation/Cocoa/…

以上是关于当我们保存在 NSUserDefaults 中时,从核心数据和应用程序中获取“<NULL>”数据会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

在 NSUserDefaults 中保存用户选择

如何在 swift 中保存和读取 NSUserdefaults 中的数组数组?

保存到 NSUserDefaults 的字典总是返回 nil

无法从 NSUserDefaults 获取字典作为保存格式

使用 NSUserDefaults 保存/加载数据 (cocos2d iphone)

NSUserDefaults 没有在 Jenkins 的模拟器中保存内存