当我们保存在 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
的对象不是属性列表支持的类型之一。您需要使对象属性列表兼容。
对不起,我不明白...
属性列表支持NSString
、NSNumber
、NSData
、NSDate
。您必须将 <null>
转换为受支持的类型之一。
好的,谢谢你的回复,我试试……
【参考方案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>”数据会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 中保存和读取 NSUserdefaults 中的数组数组?
保存到 NSUserDefaults 的字典总是返回 nil