如何设计CoreData来存储复杂数据

Sur*_*rma 1 json dictionary core-data ios swift

我需要使用CoreData在本地将来自API调用的一些数据存储为JSON.

问题是,JSON对我来说太复杂了,无法在CoreData中处理.我得到JSON作为一个Dictionary有4个按键,这些按键4再次拥有Dictionary的那些Dictionary的拥有Array的和Dictionary的.

现在,我真的不知道我应该如何为这个要求设计实体和属性,但我试着这样做,我做的是,我创建了一个实体(比如XYZ),这个实体有4个关系(一对一)到4个其他实体,这四个实体只不过Dictionary是我在JSON文件中得到的四个实体.我将这些ArrayDictionary's ' 存储为可转换的类型.这有点令人困惑,对吧?那么让我把JSON数据放在这里

{
        outerKey1 =         {
            someKey = “Some String";
            disableAutoFill = 1;
            disableABC = 1;
            disableXYZ = 1;
            disableThis = 1;
            disableThat = 1;
            disableBla = 1;
            disableBlaBla= 1;
            disableBlaBlaBlaBla = 1;
            disableBlaBlaBlaBlaBlaBla= 1;
        };
        outerKey2 =         {
            someKey =             (
                                {
                    markPath = 0;
                    title = "Some Name";
                    url = "http://www.BlaBla.com";
                },
                                {
                   markPath = 0;
                    title = "Some Name";
                    url = "http://www.something.com";
                },
                                {
                    markPath = 0;
                    title = Yahoo;
                    url = "http://www.yahoo.com";
                },
                                {
                   Path = 0;
                    title = “title";
                    url = "http://www.title.com";
                }
            );
            enabled = 1;
        };
        outerKey3 =         {
            enabled = 1;
            gatewayIP = "192.172.169.10";
            gatewayPort = 8080;
            gatewayRoutingUrls =             (
                "www.kuchbhi.com",
                "www.oh-teri.com"
            );
        };
        outerKey4 =         {
           SomeCategories =             (
                SomeCategories,
        someOtherCategories
            );
            defaultUrl = "www.meriapniwebsite.com";
            enabled = 1;
            exceptionUrls =             (
                "www.kuchbhihojay.com"
            );
            filterUrls =             (
                "www.kuchtobhi.com",
                "www.kyaaapjhandhai.com"
            );
            filteringFlag = 1;
        };
    }
Run Code Online (Sandbox Code Playgroud)

我的方法是正确还是需要纠正?或者我需要以完全不同的方式实现它.请帮帮我,谢谢

Ant*_*Dev 5

问题是您正在尝试根据JSON的结构创建CoreData实体.您应该根据JSON表示的对象以及它们之间的关系来创建实体.

您的问题并没有真正提供有关数据模型意图的足够信息,以便我给您一个确切的答案,但是将这些数据存储为一堆可转换的字典可能不是最好的答案.使用可转换属性意味着无法查询这些值,并且您没有应该在这些词典中的属性的显式列表.这意味着if let每当您访问数据时,您将有大量语句检查字典中的字符串类型值.相反,这些值中的每一个都应映射到CoreData实体上的属性.

我要问的第一件事是这些outerKey字典是否代表我的基础对象的属性和值,或者每个字典是否outerKey真正代表了与根对象有关系的自己的模型对象.如果它们是一个对象上的属性,则只需读取JSON并将值映射到实体上的属性.如果没有,那么您应该创建多个实体并创建您当前正在进行的关系,但是您应该为这些实体上的每个值创建属性.

对于嵌套数组和字典,您可能还希望创建具有关系的其他实体.

请记住,您的CoreData模型应该反映对象及其相互关联的方式.JSON除非你JSON恰好代表正确的结构,否则它不应只反映你的结构.

因为我不知道你的数据真正代表什么,这对你的应用程序来说可能不是一个完美的结构,但是对你的JSON意思做出一些假设,这就是我想出的实体.

- RootEntity
  - outerKey1: OuterKey1 // one to one
  - outerKey2: OuterKey2 // one to one
  - outerKey3: OuterKey3 // one to one
  - outerKey4: OuterKey4 // one to one

- OuterKey1
  - someKey: String
  - disableAutoFill: Bool
  - disableABC: Bool
  - disableXYZ: Bool
  - disableThis: Bool
  - disableThat: Bool
  - disableBla: Bool
  - disableBlaBla: Bool
  - disableBlaBlaBlaBla: Bool
  - disableBlaBlaBlaBlaBlaBla: Bool

- OuterKey2
  - someKey: [SomeKeyEntity] // one to many
  - enabled: Bool

- SomeKeyEntity
  - markPath: Bool
  - title: String
  - urlString: String

- OuterKey3
  - gatewayIP: String
  - gatewayPort: Int
  - gatewayRoutingURLs: [String] // This can be a transformable `Array`, unless you think you will need to query based on this property later
  - enabled: Bool

- OuterKey4
  - someCategories: [SomeCategoriesEntity] // one to many
  - defaultURL: String
  - enabled: Bool
  - exceptionURLs: [String] // This can be a transformable `Array`, unless you think you will need to query based on this property later
  - filterURLs: [String] // This can be a transformable `Array`, unless you think you will need to query based on this property later
  - filteringFlag: Bool
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 如果你只是在一个块中使用它 - 那么它是一个数据而不是很多.您可以将其存储为JSON文本块,并将`someKey`作为标识符 (2认同)