如何在不使用 [index] 的情况下从单个 CoreData 记录中获取字段(属性)?

How to get fields (attributes) out of a single CoreData record without using [index]?

我有一个 CoreData 记录,其中包含应用程序的所有设置。当我读取那条记录(使用 MagicalRecord)时,我得到了一个数组。我的问题是:我可以在不使用“[0]”(字段索引)而是使用 [@"shopOpens"] 的情况下获取记录中各个字段的可寻址性吗?

我是这么想的,但我觉得不对:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"aMostRecentFlag == 1"];  //  find old records
preferenceData = [PreferenceData MR_findAllWithPredicate:predicate inContext:defaultContext];  //  source

   NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *preferencesDict = [[userDefaults dictionaryForKey:@"preferencesDictionary"] mutableCopy];  //  target

//  start filling the userDefaults from the last Preferences record
/*
 Printing description of preferencesDict: {
 apptInterval = 15;
 colorScheme = Saori;
 servicesType = 1;
 shopCloses = 2000;
 shopOpens = 900;
 showServices = 0;
 syncToiCloud = 0;
 timeFormat = 12;
 }
 */

[preferencesDict setObject: preferenceData.colorScheme  forKey:@"shopOpens"];

更新

这就是我最终弄明白的方法,对于那些有类似问题的人:

NSPredicate *filter = [NSPredicate predicateWithFormat:@"aMostRecentFlag == 0"];  //  find old records
NSFetchRequest *freqest = [PreferenceData MR_requestAllWithPredicate: filter];
[freqest setResultType: NSDictionaryResultType];
NSDictionary *perferenceData = [PreferenceData MR_executeFetchRequest:freqest];

免责声明:我从未使用过魔法记录,所以第一部分只是一个有根据的猜测。

我认为 preferenceData 是 NSArray 的一个实例,首先是因为方法名称使用 findAll 这表明它将 return 多个实例。其次,正常的核心数据获取 return 是一个数组,并且没有明显的理由使该 find 方法 return 有任何不同。第三,您在问题中提到使用索引操作。

因此,preferenceData 很可能是存储中与指定谓词匹配的所有对象的数组。你表示只有一个这样的对象,这意味着你可以抓住第一个。

PreferenceData *preferenceData = [[PreferenceData
    MR_findAllWithPredicate:predicate inContext:defaultContext] firstObject];

现在,除非它为 nil,否则您将拥有来自核心数据存储的对象。

您应该能够以任何您喜欢的方式引用它来访问它的属性。

但是请注意,您可以使用 NSDictionaryResultType 从核心数据中获取对象作为字典,这对您来说可能是更好的选择。

此外,您可以将 dictionaryWithValuesForKeys: 发送到托管对象以获取特定属性的字典。