NSFetchedResultsController部分名称 - Tracking EFFICIENCY

时间:2012-12-04 07:20:38

标签: ios core-data nsfetchedresultscontroller

这是我的核心数据结构

实体 - 类别

Attr - ID (NSString) 主键 名称(NSString)

实体 - 产品

Attr - Id (NSString),名称(NSString), parentCategoryId (NSString) 外键 下,....

从上面可以看出, Id from Category 指向 parentCategoryId from Product

在这种情况下,我想使用与产品中相关的 parentCatrgoryId相关联的名称作为UITableView的部分名称。(我使用@“parentCategoryId”作为键到fetchrequest中的NSSortDescriptors) 但 parentCatrgoryId 只是字母数字文本。

如何解码字母数字文本,即 parentCatrgoryId从产品名称

修改

这就是我所做的&它的工作。但我想问的是,我所做的是有效的。

我又添加了一个名为 parentCategoryIdName 的属性&用它来计算一些简单的操作来存储确切的名称。

.h文件

@property (nonatomic, retain) NSMutableArray *categoryArr;
@property (nonatomic, retain) NSMutableArray *productArr;

.m文件

   NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:self.MOContext];
    // Setup the fetch request
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];
    //    [request setPredicate:[NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]];

    NSError *error;
    NSMutableArray *mutableFetchResults = [[self.MOContext executeFetchRequest:request error:&error] mutableCopy];
    [self setCategoryArr: mutableFetchResults];

    NSEntityDescription *entity2 = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:self.MOContext];
    // Setup the fetch request
    NSFetchRequest *request2 = [[NSFetchRequest alloc] init];
    [request2 setEntity:entity2];
    //    [request2 setPredicate:[NSPredicate predicateWithFormat:@""]];
    NSError *error2;
    NSMutableArray *mutableFetchResults2 = [[self.MOContext executeFetchRequest:request2 error:&error2] mutableCopy];
    [self setProductArr: mutableFetchResults2];

在数据库中插入数据

    for (int i=0; i< [self.productArr count]; i++) {
        Product *productEnt = [self.productArr objectAtIndex:i];
        NSManagedObjectContext *context = self.MOContext;

            for (int j=0; j<self.categoryArr.count; j++) {
                Category *categroy = [self.categoryArr objectAtIndex:j];
                if ([categroy.objectId isEqualToString:productEnt.parentCategoryId]) {
                    [productEnt setParentCategoryIdName:categroy.name];
                }

            // Save the context.
            NSError *error = nil;
            if (![context save:&error]) {
                // Replace this implementation with code to handle the error appropriately.
                // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                abort();
            }
        }

1 个答案:

答案 0 :(得分:0)

回顾:
从我收集的内容中,您需要id / name来形成部分并在部分标题中显示。

你的解决方案将是高效的IMO,但它应该是最后的手段:

思路: 当你必须返回时,我会从categoryId JIT获取categoryName titleForSectionAtIndex:

如果那太慢了。

在重新加载结果时获取所有部分名称。

=&GT;不要将他们留在数据库中并重复数据

<强> BUT

如果你看到它真的太慢了​​,那么以这种方式对你的数据进行非规范化就是好的IMO(它应该是最后一个需要考虑的解决方案)