MagicalRecord 获取具有行和部分的两个实体并对部分进行排序

Posted

技术标签:

【中文标题】MagicalRecord 获取具有行和部分的两个实体并对部分进行排序【英文标题】:MagicalRecord fetch two entities with row and sections and sort Sections 【发布时间】:2015-09-29 02:52:50 【问题描述】:

我有两个对象 GroupExercise > 练习,并且需要获取包含部分(标题 GroupExercise.name)和行(Exercise.name)的 tableView 请求 我如何使用 Magical Record 或 Core Data 获取两个实体

练习对象

    @interface Exercise : NSManagedObject
    @property (nonatomic, retain) NSString * name;
    @property (nonatomic, retain) NSNumber * timeRelax;
    @property (nonatomic, retain) NSNumber * type;
    @property (nonatomic, retain) NSNumber * uid;
    @property (nonatomic, retain) NSNumber * uidGroup;
    @property (nonatomic, retain) GroupExercise *groupEdge;

GroupExerciseObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * tagColor;
@property (nonatomic, retain) NSNumber * uid;
@property (nonatomic, retain) NSOrderedSet *exerciseEdge;

用代码保存对象

- (void)parseAndSaveJson:(id)json withCompleteBlock:(void (^)())completeBlock 

NSMutableArray *groupsArray = (NSMutableArray *) json;

NSLog(@"%@", json);

if (groupsArray != nil) 

    NSArray *allEntities = [NSManagedObjectModel MR_defaultManagedObjectModel].entities;

    [allEntities enumerateObjectsUsingBlock:^(NSEntityDescription *entityDescription, NSUInteger idx, BOOL *stop) 
        [NSClassFromString([entityDescription managedObjectClassName]) MR_truncateAll];
    ];

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) 


        for (int groupIndex = 0; groupIndex < [groupsArray count]; groupIndex++) 


            GroupExercise *localGroup = [GroupExercise MR_createEntityInContext:localContext];

            localGroup.name = groupsArray[groupIndex][LOCAL_GROUPS_NAME];

            localGroup.tagColor = groupsArray[groupIndex][LOCAL_GROUPS_TAG_COLOR];

            localGroup.uid = @([groupsArray[groupIndex][LOCAL_GROUPS_ID_GROUP] intValue]);


            NSMutableArray *exerciseArray = (NSMutableArray *) groupsArray[groupIndex][LOCAL_GROUPS_EXERCISES];

            NSMutableSet *set = [[NSMutableSet alloc] init];

            for (int exerciseIndex = 0; exerciseIndex < [exerciseArray count]; exerciseIndex++) 

                Exercise *exercise = [Exercise MR_createEntityInContext:localContext];

                exercise.name = exerciseArray[exerciseIndex][EXERCISE_NAME];
                exercise.uid = @([exerciseArray[exerciseIndex][LOCAL_EXERCISE_ID_EXERCISE] intValue]);
                exercise.uidGroup = @([groupsArray[groupIndex][LOCAL_GROUPS_ID_GROUP] intValue]);
                exercise.groupEdge = localGroup;

                [set addObject:exercise];
            

            [localGroup addExerciseEdge:set];
        

                     completion:^(BOOL contextDidSave, NSError *error) 

        completeBlock();

    ];


并使用 FRC

- (NSFetchedResultsController *)fetchedResultsController 
if (_fetchedResultsController != nil) 
    return _fetchedResultsController;


_fetchedResultsController = [Exercise MR_fetchAllGroupedBy:@"groupEdge" withPredicate:nil sortedBy:@"uid" ascending:true];


_fetchedResultsController.delegate = self;
return _fetchedResultsController;

如何使用 groupEdge.name 对部分进行排序?

【问题讨论】:

组在显示时会改变吗?你真的需要两个都取,还是只需要练习? 【参考方案1】:

我用代码解决了

_fetchedResultsController = [Exercise MR_fetchAllGroupedBy:@"groupEdge" withPredicate:nil sortedBy:@"uidGroup,uid" ascending:true];

【讨论】:

以上是关于MagicalRecord 获取具有行和部分的两个实体并对部分进行排序的主要内容,如果未能解决你的问题,请参考以下文章

CoreData(MagicalRecord) 获取保存的对象

ios MagicalRecord 排序。需要部分标题列表

如何使用 MagicalRecord 过滤和获取记录?

使用 django html 模板创建具有动态行和列的表

具有 MagicalRecord 的多个数据模型

MagicalRecord 并不总是保存更改