将核心数据过滤/排序到数组中

Posted

技术标签:

【中文标题】将核心数据过滤/排序到数组中【英文标题】:Filter/Sort Core Data into Array 【发布时间】:2014-05-03 03:33:41 【问题描述】:

我有一个核心数据模型,其中包含一个名为 Expense 的实体。它包含一个名为 time 的属性,该属性存储一个 NSDate。

将所有这些费用分类到按月份分类的单个 NSMutableArray 中的有效方法是什么?

例如,如果有以下日期的五项费用:

2014 年 1 月 6 日

2 2014 年 2 月 4 日

2014 年 5 月 2 日 3 日

4 2014 年 6 月 5 日

5 2014 年 9 月 4 日

应该返回一个 NSMutableArray 包含一堆数组。每个数组代表 1 个月,其中包含所有归属于它的实体。

【问题讨论】:

看看这个苹果示例项目。developer.apple.com/library/ios/samplecode/DateSectionTitles/… ref。 - ***.com/a/5610898/1547907 【参考方案1】:

例子:

// Get expenses from Core Data
NSArray *expensesToCategorize = ...;

// Create calendar
static NSCalendar *gregorian = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
    gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
);

// Set time zone of calendar
[gregorian setTimeZone:[NSTimeZone defaultTimeZone]];

// Group expenses by month
NSMutableDictionary *expensesByMonth = [[NSMutableDictionary alloc] init];
for (Expense *expense in expensesToCategorize) 
    NSDate *date = expense.time;

    NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:date];
    [components setDay:1];

    NSDate *firstDayOfMonth = [gregorian dateFromComponents:components];

    NSMutableArray *expensesThisMonth = expensesByMonth[firstDayOfMonth];
    if (!expensesThisMonth) 
        expensesThisMonth = [[NSMutableArray alloc] init];
        expensesByMonth[firstDayOfMonth] = expensesThisMonth;
    

    [expensesThisMonth addObject:expense];


// Transform into desired data structure
NSArray *sortedMonthDates = [[expensesByMonth allKeys] sortedArrayUsingSelector:@selector(compare:)];
NSArray *categorizedExpenses = [expensesByMonth objectsForKeys:sortedMonthDates notFoundMarker:[NSNull null]];

// Sort expenses within each month by date
for (NSMutableArray *expensesThisMonth in categorizedExpenses) 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"time" ascending:YES];
    [expensesThisMonth sortUsingDescriptors:@[sortDescriptor]];

【讨论】:

【参考方案2】:

带有自定义对象的数组

NSArray *sorted = [arr sortedArrayUsingFunction:dateSort context:nil];

排序功能

NSComparisonResult dateSort(Class *s1, Class *s2, void *context) 
NSDate *d1 = [Utility getDateFromTheString:s1.strDate];
NSDate *d2 = [Utility getDateFromTheString:s2.strDate];
return -1*[d1 compare:d2];

将字符串转换为日期

 +(NSDate *)getDateFromTheString:(NSString *)strDate
    NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
    [dateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *date = [dateFormat dateFromString:strDate];
    return date;

【讨论】:

【参考方案3】:

您在寻找 fetchedResultsController 吗?

例如,以下代码填充 fetchedResultsController 以在 Grouped TableViewController 中使用

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Location"
                                              inManagedObjectContext:_managedObjectContext];
    [fetchRequest setEntity:entity];

    [fetchRequest setSortDescriptors:@[
     [[NSSortDescriptor alloc] initWithKey:@"map_name" ascending:YES],
     [[NSSortDescriptor alloc] initWithKey:@"order_num" ascending:YES]
     ]];

    [fetchRequest setFetchBatchSize:20];


    // Use the sectionIdentifier property to group into sections.

    _fetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:_managedObjectContext
                                          sectionNameKeyPath:@"map_name"
                                                   cacheName:@"LocationsList"];

【讨论】:

以上是关于将核心数据过滤/排序到数组中的主要内容,如果未能解决你的问题,请参考以下文章

排序和过滤核心数据关系的更有效方法是啥?

使用 Swift 过滤 UISearchBar 的核心数据

按值数组过滤核心数据数组字段

核心数据 - 使用数组的确切元素获取对象过滤数据

数组过滤后的重新排序问题

如何将从服务接收到的 json 数据传递到 Angular 4 的角材料组件中的数组