【问题标题】:preparing a core data result set for a grouped uitableview为分组的 uitableview 准备核心数据结果集
【发布时间】:2010-07-14 06:04:53
【问题描述】:

我有一个从数据源对象创建的 NSMutableArray

NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

[self setAmountArray: mutableFetchResults];

我的可变数组中的每个对象都有两个实例变量nametimeadded

现在我想在按添加日期分组的 uitableview 中显示所有名称。为此,我编写了以下方法

-(NSMutableArray*)arrangeTransfersByDate:(NSMutableArray*)transferArray {

    // Setting up objects for this method
    NSDate *oldDate = [NSDate dateWithTimeIntervalSince1970:0.0f];
    NSDateFormatter *dateComparisonFormatter = [[NSDateFormatter alloc] init];
    [dateComparisonFormatter setDateFormat:@"yyyy-MM-dd"];
    NSMutableArray *returnArray = [[NSMutableArray alloc] init];

    for(transfers *transfer in transferArray) {

        if( [[dateComparisonFormatter stringFromDate:[transfer timeadded]] isEqualToString:[dateComparisonFormatter stringFromDate:oldDate]] ) {
            if([returnArray count] == 0) {
                [returnArray addObject:[NSMutableArray arrayWithObject:transfer]];
            } else {
                [[returnArray objectAtIndex:[returnArray count]-1] addObject:transfer];
            }
        } else {
            [returnArray addObject:[NSMutableArray arrayWithObject:transfer]];
            oldDate = [transfer timeadded];
        }

    }
    //[returnArray release];
    [dateComparisonFormatter release];
    return returnArray;


}

transferArray 是我的amountArray,存储我的核心数据对象。

所以这行得通!但是

有没有更好的方法来做到这一点?你能给我一个“最佳实践”之类的东西,或者看看是否有内存泄漏?

谢谢!


编辑:

正确答案是NSFetchedResultController 及其sectionNameKeyPath

但是我不想一次存储我的数据两次。

所以我在 NSManagedObject 中创建了以下 getter 方法。

- (NSString *) pubDate {

    [self willAccessValueForKey:@"pubDate"];

    NSDateFormatter *dateComparisonFormatter = [[NSDateFormatter alloc] init];
    [dateComparisonFormatter setDateFormat:@"dd.MM.YYYY"];
    NSString *temp = [dateComparisonFormatter stringFromDate:[self pubTime]];
    [dateComparisonFormatter release];

    [self didAccessValueForKey:@"pubDate"];

    return temp;
}

有了这个,我可以使用我的 FetchedResultController 和我的pubTime(这是一个时间戳)按日期对我的 tableviewcontroller 进行排序。

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                              managedObjectContext:[self managedObjectContext] 
                                                sectionNameKeyPath:@"pubDate" 
                                                         cacheName:@"transfersRoot"];

谢谢大家

【问题讨论】:

    标签: iphone objective-c uitableview core-data


    【解决方案1】:

    通常,当您想在UITableView 中显示核心数据提取的结果时,您可以使用NSFetchedResultsController。您可以通过在初始化期间指定 sectionNameKeyPath 来选择要对结果进行分组的属性。

    也就是说,如果您的方法有效,那么您是否要更改代码完全取决于您。

    但请在退货之前确保您[returnArray autorelease]。这是一个普遍接受的 Objective-C 实践,任何名称中没有“alloc”、“new”或“copy”的方法都将返回一个自动释放的对象。

    【讨论】:

    • NSFetchedResultsController 看起来不错。但是如何在时间戳上使用sectionNameKeyPath,那总是不同的?也感谢自动释放提示!
    • 我猜你的transfers 类是你的数据模型的实体类?好吧,您可以向其中添加一个属性,该属性从时间戳中提取日期,然后将该属性的键路径作为sectionNameKeyPath 传递。
    • 你是对的。我还需要确切的时间戳,所以你认为我应该重复输入日期?一次是真实的时间戳,一次是我数据库中的日期?嗯
    • date 属性将仅用于生成节标题。您仍然可以在任何需要的地方使用您的时间戳。并且日期不会存储在您的数据库中,它应该在运行时生成。
    • 舒尔。我只考虑了数据库规范化以及连续两次存储“相同”值。
    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多