簡體   English   中英

核心數據按年份分組並按日期排序

[英]Core Data Group By Year and Sort By Date

我是 Core Data (iOS 7) 的新手,我正在嘗試從 FMDB 上的 SQL 切換到 Core Data 獲取數據的方式。

我有一個條目實體,其中包含如下數據:

flightDate (date) |  duration (float)
-------------------------------------
  2014-05-21      |      1.0
  2014-08-03      |      2.0
  2013-03-27      |      3.0
  2013-09-16      |      4.0
  2012-12-20      |      5.0
-------------------------------------

我的最終目標是將這些數據呈現在 tableView 中,以年份作為部分標題,並按時間倒序在其下方列出該年份的每個條目。 所以數據看起來像這樣:

-- 2014 --
Aug 3, 2014     (2.0)
May 21, 2014    (1.0)

-- 2013 --
Sep 16, 2013    (4.0)
Mar 27, 2013    (3.0)

-- 2012 --
Dec 20, 2012    (5.0)

這在 SQL 中很容易實現,但經過數小時的研究,這正在變得類似於 Core Data 中沒有麻醉的心臟手術。

最后,我認為擁有這樣的 NSMutableDictionary 會很好:

{
  2014 = {
    <Entry: Aug 3, 2014, 2.0>,
    <Entry: May 21, 2014, 1.0>  
  },
  2013 = {
    <Entry: Sep 16, 2013, 4.0>,
    <Entry: Mar 27, 2013, 3.0>  
  },
  2012 = {
    <Entry: Dec 20, 2012, 5.0>
  }
}

...以正確的順序並准備傳遞給我的 tableView 代表。 如何從 Core Data 對象獲取時間排序和分組的字典數據而不會失去理智?

提前致謝。

使用NSFetchedResultsController
您可以找到根據Apple的日期將表格分成多個部分的工作示例!

  1. 創建一個 NSFetchRequest。 為日期列添加排序描述符。 這將使您的行井然有序。
  2. 在您的托管對象上下文上執行獲取請求,取回您的結果
  3. 將每個日期分解成組件(使用類似這樣的.
  4. 迭代、構建數組,無論您需要做什么來將結果轉換為您想要的格式。

1 看起來像這樣:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Entry"];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"flightDate" ascending:NO];
fetchRequest.sortDescriptors = @[sortDescriptor];

核心數據存儲NSDate s。 它們是不透明的、抽象的、時間戳。 他們天生就沒有一年。 根據您的時區和日歷,相同的NSDate將顯示不同的年份。

例如,如果格式正確,表示 2001 年 1 月 1 日 GMT 00:01 的NSDate將在 GMT 電話上顯示為“2001”。 它將在 EST 的電話上顯示為“2000”。 如果手機設置為使用中國日歷而不是公歷,它將再次顯示為非常不同的內容。

我不清楚為什么你會認為這個“SQL 中的簡單易行”。 可能您正在以某種方式大規模簡化問題?

您可能想要添加一個臨時屬性來返回年份。 這將是NSDate上的NSCalendar驅動計算,涉及獲取NSDateComponents

您可以提供瞬態特性為sectionNameKeyPath一個NSFetchedResultsController

但是請注意語義:除非您檢查表中的每一件事,否則您不知道年份是多少。 所以你需要獲取每一件事。 出於性能原因,您可能希望明確告訴您的 fetch 請求不要返回錯誤*,因此您不會從 Core Data 的自動內存管理中獲得任何好處。

(*) Core Data 懶惰地獲取其圖中的對象。 查詢通常會返回錯誤,這些錯誤是對原始對象的引用,因此可以找到它但找不到實際數據。 但是由於對屬性的訪問是同步的,如果您像填充一樣遍歷錯誤,這意味着糟糕的性能——Core Data 無法預測您接下來要訪問哪些對象,因此每次訪問都是對持久存儲的單獨訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM