【发布时间】:2014-05-19 16:50:54
【问题描述】:
对于冗长的解释我很抱歉,但是我觉得有必要解释一下细节,以便我能够以最佳方式获得帮助,以创建正确的核心数据模型来满足我的要求。
我只是想找出创建数据模型的最佳方法,以便我能够以快速有效的方式实现以下目标,这在我当前的 MySQL 设置中目前是不可能的。我正在使用 MySQL 从服务器返回所有值,但现在希望使用 CoreData 来缓存这些数据,并且只下载新的日期数据。
我有一个存储这样的数据集的数据库:
{
"Agent_Id" = 32;
"Order_FinalisedDate" = "2014-05-17 03:39:54";
"Order_Id" = 2596;
"Order_ReferenceNumber" = "Pavan/0905/016";
"PieChart_Id" = 13585;
"PieChart_QuantityATOP" = 150;
"PieChart_TotalAmount" = 52500;
"Product_Id" = 20;
}
每次加载 viewController 时,我都有 13,585 个这样的数据集从服务器飞入。处理从服务器检索到的数据需要 1 分半钟。这是非常低效的,我试图创建一个核心数据模型来帮助我处理流程以显着减少时间。
这是在没有 Core Data 的情况下发生的当前过程
-
我只对过去 12 个月的滚动感兴趣,就像银行如何退回过去 12 个月的帐户一样。因此,我从服务器获取了一个 JSON 格式的实时动态数组,将它们很好地复制到其自定义的
李>BankDateDataModel数据模型中,该数组名为monthsChartDataDictionary,该数组以yyyy-MM的这种格式存储数据。 -
然后,我会检查所有的销售,如果它的日期可以与
monthsChartDataDictionary数组中的匹配日期相关联,则对其进行抓取和分类。//Go through each data set for(id key in JSONDictionary){ //First lets store each data set which we will use for another process. PieChartSliceDataModel *pcs = [[PieChartSliceDataModel alloc] initWithJSONData:key]; [allPieChartDataArray addObject:pcs]; /** Check to see if we have a date entry in the format of `yyyy-MM` If there is a */ if([monthsChartDataDictionary objectForKey:pcs.PCS_StringOrderFinalisedDate]){ [[monthsChartDataDictionary objectForKey:pcs.PCS_StringOrderFinalisedDate] addObject:pcs]; } }这本质上是创建的 - 月ChartDataDictionary。一个字典,其键格式为
yyyy-MM,并在其关联键中包含一组数据集。{ //An nsdictionary holding over 13,500 elements. "2013-05"=(..,..,..); "2013-06"=(..,..,..); "2013-07"=(etc); "2013-08"=(); "2013-09"=(); "2013-10"=(); "2013-11"=(); "2013-12"=(); "2014-01"=(); "2014-02"=(); "2014-03"=(); "2014-04"=(); "2014-05"=(); } -
然后运行一个 for 循环来同时完成两件事,请参见下面的 a) 和 b):
a) 对于 monthsChartDataDictionary 字典中的每个月,我通过统计每个数据集的
PieChart_TotalAmount来获得该月的总销售额。这用于创建显示全年总销售额的折线图。b) 制作了一个新字典 - finalPieChartData,其中每个键的格式为
yyyy-MM,存储的值是一个产品数组,显示每个产品的总销售额。这样可以制作一个饼图,显示在任何给定月份内的产品销售情况。其中12sp B - 250是产品名称。
如何在核心数据模型中最好地表示所有这些?
我在想是否有办法存储所有必需的数据,包括总销售额,并在给定月份内将不同产品的销售额分开......全部存储在核心数据中......或者最好在什么时候进行这些计算它们是从核心数据数据库中返回的,我猜这只会导致更多延迟。
到目前为止我有这个:
我创建这个的逻辑基于以下想法:
- 我可以拥有一个存储所有单独数据集的数据库
- 另一个存储折线图每月总销售额的表,所以我不必继续执行计算,除非我需要更新最近一个月的销售数据,因为我获得了仍在发生的新销售同月。
- 除了每月销售核心数据模型之外,还会有一组饼图切片,它们表示任何特定月份内每个产品 ID 的总销售额。这意味着我不必一次又一次地处理计算。
这是正确的吗?有没有一种有效的方法来存储所有内容?
更新 1:更新了提议的核心数据模型,以便在应用程序中实现后提高效率
【问题讨论】:
-
这不是一个固执己见的问题。我正在寻找核心数据模型设计的好方法。
-
您对优化模型以使 UI 响应和应用程序的内存占用最小化特别感兴趣,对吧?因为您提到了缓慢的获取,但没有提及用于此的核心数据堆栈...是否创建临时上下文,以及是否使用父子等。但是核心数据堆栈和后台获取与此问题是分开的对吧?
-
嘿@stevesliva,我没有使用核心数据堆栈atm。需要很长时间的是我在第 1 步中提到的。将
json数据处理为nsdictionary,另一个需要很长时间的部分是第 2 步,我创建了所有饼图数据。因此,我特别要求构建数据模型的最佳方法,以便所有数据都已处理好,可以使用所有预先计算的值进行检索,因为它们将像这样保存到数据存储中,然后只需要被提出。续。 -
续。因此,为什么我试图找到最好的方式来存储所有需要的数据,这样当我检索数据时,我不需要做任何处理。
-
@stevesliva,有人吗?!
标签: ios objective-c core-data