在iPhone上的Core Data中存储任意JSON键/值

时间:2013-01-17 20:49:19

标签: iphone json core-data subquery

我一直在努力应对这一挑战大约一周,而且还没有找到合适的解决方案。我的挑战是:

我有一个JSON模型,其中包含任意键/值对的属性列表。我的意思是,键/值对在编译时是未知的。只要模型是事先定义的,就可以很容易地在核心数据中建模和存储JSON,但是如果你不知道键的名称和值的类型,事情就会很快变得困难。就我而言,这是我所面临的现实。

我的模型看起来像这样:

{
    knownKey1:knownType1,
    knownKey2:knownType2,
    properties:{
        someKey1:someType1,
        someKey2:someType2,
    }
}

现在,理想情况下,我需要能够直接在商店中对这些任意键/值对执行搜索。我可以按照与Arbitrary Attributes in Core DataHow can I use NSPredicate to filter on core data relationships?中描述的方法类似的方法,使用sub queries和NSPredicates来实现这一点。

按照这种方法,我有类似“对象”实体的东西,它与“属性”实体有多对多的关系:

Object <--->> Property

属性有两个属性“key”和“value”:

Property
    key : someKey
    value : someValue

这有效地允许我在Core Data中的JSON对象的属性列表中建模和持久化任意键。并使用如下的子查询,我可以根据这些键/值对(用浏览器编写,没有编译器等)来获取:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SUBQUERY($properties, $element, $element.key == %@ AND $element.value == %@) != 0", someKey, someValue];

到目前为止,只要知道“钥匙”和“价值”的类型,一切都很好,花花公子。键将始终是一个字符串,如果我限制自己的值始终是一个字符串,我很高兴去,这就是它的结束。我有我的对象/属性关系,我可以将任意键与字符串值相关联,并在存储中根据这些值进行搜索。

但是,我希望解决方案更灵活一点,我想支持String,Int,Bool,Date,它们通常在JSON中找到,并且也作为Core Data中的类型存在,但我还没有能够为此找到一个好的方法。也许有一些我不知道的东西?

我的第一种方法是让一个Property抽象实体与Object有关系,并且是StringProperty,NumberProperty等的父对象。该键将在Property中定义,并且在任一子节点中定义,这意味着我可以键入值StringProperty中的字符串和NumberProperty中的Integer16等,但这不起作用,因为Property没有定义值,因此我无法在属性/对象关系的一般级别上执行搜索。

我现在正在考虑摆脱Parent / Child结构,只创建一个StringProperty和一个NumberProperty,然后让每个都与Object有关系,这意味着Object与StringProperty和to-many有很多关系与NumberProperty的关系。这不是超级优雅,但我可能能够在某个界面隐藏这个实现。

我真的不喜欢这个解决方案,但这是我现在想的路线。我已经解决过的其他事情:可转换的属性,但这些属性在存储中是不可搜索的。另外:一起删除存储中的搜索,只需存储属性列表的JSON字符串,并根据请求将其转换为NSDictionary,但我认为这是最后的手段。

任何建议,可能有一种方法,我只能看到树木?

0 个答案:

没有答案