如何在不使用 [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:
发送到托管对象以获取特定属性的字典。
我有一个 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:
发送到托管对象以获取特定属性的字典。