2015-10-26 64 views
1

我有一个包含所有应用程序设置的CoreData记录。当我读取单个记录(使用MagicalRecord)时,我得到一个数组。我的问题是:我可以不使用“[0]”(字段索引),而是使用[@“shopOpens”]来获得记录中各个字段的可解决性?如何在不使用[index]的情况下从单个CoreData记录中获取字段(属性)?

我在想这样的事情,但我不认为这是正确的:

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"]; 

UPDATE

这是怎么了,我终于想通了,对于那些谁也有类似的问题:

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

为什么使用Magical Record和NSUserDefaults来存储相同的信息?它看起来像NSUserDefaults就足够了。 –

+0

需要CoreData存储,因为它最终将转到iCloud进行共享。首选项是3个实体之一,也是唯一需要在iCloud中最终修改的商店。 – SpokaneDude

回答

1

声明:我从来没有使用神奇的记录,所以第一部分只是一个受过教育的猜测。

我想,preferenceData是NSArray的一个实例,首先是因为方法名称使用findAll这表明它将返回多个实例。其次,一个普通的核心数据提取返回一个数组,find方法没有明显的原因返回任何不同的东西。第三,你在你的问题中使用索引操作引用。

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

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

现在,除非它是零,否则您将拥有核心数据存储中的对象。

您应该能够以任何方式引用它,以便访问其属性。

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

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

+0

MagicalRecord的确与这个问题无关,我不知道为什么我把它放在那里!这就是说,是的,我知道CoreData返回一个数组;我想采用该数组(由于* mostRecentFlag *,可能只有1条返回的记录是相关的)。我想记录这个记录并检索每个字段(属性)并将其放置在一个* managedObject *中,该对象中包含大约50个字段。我知道我可以使用数字索引来实现,但我希望使用* managedObject *中的字段名称来避免CoreData更改CoreData记录中属性的顺序。 – SpokaneDude

+1

请阅读帖子的第二部分。您可以将提取的对象作为字典返回。您还可以创建一个托管对象和一组键的字典。你可以更进一步,并从字典'setValuesForKeysWithDictionary:'中设置值。可可API提供了一个体面的动态界面,用于根据键值对改变和观察对象。 –

+0

我想通了你的帮助...谢谢...我已经更新了这个问题,以显示我的版本如何做到这一点。 – SpokaneDude

相关问题