0

我正在使用 Fetch 从我的 sqlite 数据库中查询行并将结果加载到 NSMutableArray myDataArray 中。我想要做的是将 myDataArray 中的值存储到我的应用程序的首选项 plist 文件中。但是当我运行下面的代码时,出现以下错误:

[NSUserDefaults setObject:forKey:]:尝试插入类“__NSArrayM”的非属性值“(...(注意:包含 50 行值))”。

我使用相同的方法将其他 NSMutableArrays 存储在我的 plist 文件中,但无法找到存储查询的数据库结果的方法。

您可能会问:为什么要存储这些值,当我再次需要这些值时才重新查询数据库?原因是我从数据库中提取随机行,我需要完全按照最初随机的方式调用这些行。

任何帮助表示赞赏,lq

 ...
 fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
 self.myDataArray = [NSMutableArray arrayWithArray:fetchResults];

 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
 [userDefaults setObject:self.myDataArray forKey:kFetchResultsArray];
4

1 回答 1

0

myDataArray 中的项目不是属性列表对象,因此它们不能自动序列化为 plist。

NSUserDefaults 类setObject:forKey:参考:

value 参数只能是属性列表对象:NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。请参阅“什么是属性列表?” 在属性列表编程指南中。

您可能需要考虑使用用户默认值以外的机制来存储此数据。从属性列表编程指南

许多应用程序需要一种机制来存储以后需要的信息。对于需要存储少量持久数据(例如少于几百 KB)的情况,属性列表提供了一种统一且方便的方式来组织、存储和访问数据。

在某些情况下,属性列表架构可能证明是不够的。如果您需要一种方法来存储大型、复杂的对象图、属性列表体系结构不支持的对象或必须保留可变性设置的对象,请使用归档。有关详细信息,请参阅存档和序列化编程指南

于 2010-10-04T19:31:53.970 回答