繁体   English   中英

从一对多关系核心数据的实体中获取对象

[英]Fetch objects from an entity of one to many relationship core data

在此处输入图片说明

为了解决这个问题,我一直都在挠头,但不幸的是我做不到。

所以我的问题是我有一个讲座对应的多个值,所以我将演讲TpPbl,lectureToProfessor,lecturetoStudyProgram关系设置为一对多关系,如图所示。

我保存到数据库,如下所示:

   -(void)saveToDatabase:(NSMutableDictionary *)inData{
     LectureDetails *lectureDetail = (LectureDetails *)[NSEntityDescription        insertNewObjectForEntityForName:@"LectureDetails" inManagedObjectContext:context];
    [lectureDetail setAverageRating:[inData valueForKey:kLectureAverageRating]];
    [lectureDetail setCategoryID:[inData valueForKey:kLectureCategoryID]];
    [lectureDetail setCategoryName:[inData valueForKey:kLectureCategoryName]];
    [lectureDetail setLectureID:[inData valueForKey:kLectureID]];
    [lectureDetail setSemesterID:[inData valueForKey:@"SemesterID"]];
    [lectureDetail setStartTime:[inData valueForKey:kLectureStartTime]];
    [lectureDetail setRatingType:[inData valueForKey:kRatingType]];
    [lectureDetail setMonth:[NSNumber numberWithInt:[[[[inData valueForKey:kLectureDate] componentsSeparatedByString:@"-"] objectAtIndex:1] integerValue]]];
    [lectureDetail setDateOnly:[NSNumber numberWithInt:[[[[inData valueForKey:kLectureDate] componentsSeparatedByString:@"-"] objectAtIndex:2] integerValue]]];


    for (id prof in [inData valueForKey:@"Professors"]) {
        ProfessorsInLecture *profData = (ProfessorsInLecture *)[NSEntityDescription insertNewObjectForEntityForName:@"ProfessorsInLecture" inManagedObjectContext:context];
        profData.professorID=[NSNumber numberWithInt:[[prof valueForKey:@"ProfessorID"]integerValue]] ;
        profData.professorFirstName=[prof valueForKey:@"ProfessorFirstName"];
        profData.professorLastName=[prof valueForKey:@"ProfessorLastName"];
        profData.ProfessorUserName=[prof valueForKey:@"ProfessorUserName"];

        [lectureDetail addLectureToProfessorObject:profData];
    }
    for (id prog in [inData valueForKey:@"StudyPrograms"]) {
        StudyProgramInLecture *stdyProgramData = (StudyProgramInLecture *)[NSEntityDescription insertNewObjectForEntityForName:@"StudyProgramInLecture" inManagedObjectContext:context];
        stdyProgramData.sMID=[prog valueForKey:@"SMID"];

        [lectureDetail addLectureToStudyProgramObject:stdyProgramData];
    }
    for (id pblData in [inData valueForKey:@"PBLs"]) {
        PBLinLectures *pbl = (PBLinLectures *)[NSEntityDescription insertNewObjectForEntityForName:@"PBLinLectures" inManagedObjectContext:context];
        [pbl setLecturePBLID:[pblData valueForKey:@"LecturePBLID"]];
        [pbl setPBLID:[pblData valueForKey:@"PBLID"]];
        [lectureDetail addLectureToPBLObject:pbl];
    }

    NSError *error1;
    if (![context save:&error1])
    {
        //NSLog(@"ERROR--%@",error);
        abort();
    }
}

所有数据都正确保存,但是获取数据时出现问题。 现在假设我必须获取一个讲义,该讲义的学期ID = 7,月份= 12,日期= 20,(在关系表中)sMID = 2,在(关系表中)pBLID = 4。

我到目前为止所做的是获取

-(NSMutableArray *)fetchDataforMonth:(NSNumber *)month andDate:(NSNumber *)dateOnly
{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"LectureDetails" inManagedObjectContext:context];

// Setup the fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY lectureToPBL.pBLID ==%@", [NSNumber numberWithInt:[[[UserDetail sharedInstance].userDetail valueForKey:@"pBLID"]integerValue]]];

NSPredicate *pred1 =
[NSPredicate predicateWithFormat:@"(dateOnly == %@)",dateOnly];

NSPredicate *pred2 =
[NSPredicate predicateWithFormat:@"(month == %@)",month];

NSPredicate *pred3 =
[NSPredicate predicateWithFormat:@"(semesterID == %@)",[NSNumber numberWithInt:[[[UserDetail sharedInstance].userDetail valueForKey:@"semesterID"]integerValue]]];

 NSPredicate *pred4 = [NSPredicate predicateWithFormat:@"ANY lectureToStudyProgram.sMID ==%@", [NSNumber numberWithInt:[[[UserDetail sharedInstance].userDetail valueForKey:@"programID"]integerValue]]];

NSArray *compPredicatesList = [NSArray arrayWithObjects:pred1,pred2,pred3,predicate,pred4, nil];

NSPredicate *CompPrediWithAnd = [NSCompoundPredicate andPredicateWithSubpredicates:compPredicatesList];

[request setPredicate: CompPrediWithAnd];

// Fetch the records and handle an error
NSError *error;
NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy];


return mutableFetchResults;
}

如果有一个sMID和一个pBLID,则提取工作正常,否则获取结果中没有对象。 假设我有一个讲座,其semesterID为7,month = 12,day = 20,并且具有sMID的倍数(例如1,2,3)和pBLID的倍数(例如= 4,5,6),并且我想获取一个month = 12的讲座和天= 20和sMID = 2和pBLID = 4

有人可以告诉我该怎么做吗?

任何帮助将不胜感激。 谢谢

首先从LectureDetails实体中筛选出月= 12和天= 20的讲师:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(month == %@) AND (dateOnly == %@) ",month, dateOnly];

[request setPredicate: pred];

NSError *error;

NSArray *lectureList = [context executeFetchRequest:request error:&error];

 then filter this array with pBLID and sMID.

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lectureToStudyProgram.sMID ==%@) AND (ANY lectureToStudyPBL.pBLID ==%@)", sMID, pBLID];

 lectureList = [lectureList filteredArrayUsingPredicate:predicate];

现在讲课列表将为您提供结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM