บันทึกเอนทิตีด้วย MagicalRecord - พยายามบันทึกเอนทิตีอื่นด้วยหรือไม่

แอพของฉันได้รับการตั้งค่าให้ดึงรายการสิ่งต่าง ๆ จากเอนทิตีเดียว (รายการสถานที่ (โรงเรียน)) และใส่ไว้ในเครื่องมือเลือกภายในมุมมองของฉัน

ในมุมมอง ผู้ใช้เลือกสถานที่และระยะทางจะถูกสร้างขึ้นโดยอัตโนมัติ (ตั้งค่าล่วงหน้าภายในเอนทิตีเดียวกันกับที่เราได้รับสถานที่)

เมื่อพวกเขาคลิก "บันทึกรายการ" ฉันต้องการให้บันทึกไปยังเอนทิตีอื่นใน coredata และฉันเชื่อว่าฉันได้ตั้งค่าให้ทำอย่างถูกต้อง แต่มันทำให้เกิดข้อผิดพลาดนี้:

2014-02-19 10:20:34.545 54 Miles[19263:70b] Selection 1: Aldrin
2014-02-19 10:20:34.546 54 Miles[19263:70b] Selection 2: Addams
2014-02-19 10:20:34.548 54 Miles[19263:70b] Miles: 1.8
2014-02-19 10:20:34.550 54 Miles[19263:70b] DrivenDate: 2014-02-19 16:15:31 +0000
2014-02-19 10:20:34.550 54 Miles[19263:70b] Date: 2014-02-19 16:20:34 +0000
2014-02-19 10:20:34.561 54 Miles[19263:70b] CoreData: error: (NSFetchedResultsController) object <MetaMiles: 0x8a8abb0> (entity: MetaMiles; id: 0x8a34d30 <x-coredata:///MetaMiles/t8DB6BCC9-78DF-4699-A86A-538E7ABD85292> ; data: {
    "beg_school" = nil;
    "end_school" = nil;
    miles = 0;
}) returned nil value for section name key path 'beg_school'. Object will be placed in unnamed section
2014-02-19 10:20:34.563 54 Miles[19263:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSSetM addObject:]: object cannot be nil'

ฉันได้ตั้งค่าให้สะท้อนทุกสิ่งที่ควรได้รับการบันทึกลงในเอนทิตี (เพียงเพื่อการทดสอบเพื่อให้แน่ใจว่าได้รับข้อมูลที่เหมาะสม) และตามบันทึก - ฉันเห็นว่าได้รับข้อมูลที่เหมาะสม แต่ส่วนที่สองดูเหมือนว่าจะพยายามบันทึกบันทึก MetaMiles เช่นกัน ฉันไม่ต้องการให้ทำเช่นนี้ เอนทิตี MetaMiles เป็นเพียงเอนทิตีที่ฉันได้รับข้อมูล โดยไม่จำเป็นต้องบันทึกใดๆ เลย ฉันจะระบุเฉพาะบันทึกเอนทิตี UserMiles และไม่บันทึกเอนทิตี MetaMiles ได้อย่างไร (ที่ฉันดึงข้อมูลจากเดิม)

รหัสปุ่มของฉันมีลักษณะดังนี้:

//Button to track miles
- (IBAction)trackMilesButton:(id)sender {
    //When button is clicked - save the trip to the User_Miles database!
    UserMiles *newMilesEntry = [UserMiles MR_createEntity];
    //Configure entry data
    [newMilesEntry setEnd_school:[_schoolArray1 objectAtIndex:[_tripPicker selectedRowInComponent:0]]];
    NSLog(@"Selection 1: %@",[_schoolArray1 objectAtIndex:[_tripPicker selectedRowInComponent:0]]);
    [newMilesEntry setBeg_school:[_schoolArray1 objectAtIndex:[_tripPicker selectedRowInComponent:1]]];
    NSLog(@"Selection 2: %@",[_schoolArray1 objectAtIndex:[_tripPicker selectedRowInComponent:1]]);
    NSArray *currentMiles = [self getMileage];
    MetaMiles *tripMiles = [currentMiles objectAtIndex:0];
    [newMilesEntry setMiles:tripMiles.miles];
    NSLog(@"Miles: %@",tripMiles.miles);
    [newMilesEntry setDriven_date:self.datePicker.date];
    NSLog(@"DrivenDate: %@", self.datePicker.date);
    [newMilesEntry setEntry_date:[NSDate date]];
    NSLog(@"Date: %@", [NSDate date]);

    //Save the data & reload View
    [NSManagedObjectContext MR_rootSavingContext];
    [self viewDidLoad];
}

ไม่คุ้นเคยกับ CoreData มากนัก เนื่องจากฉันยังคงเรียนรู้ทั้งหมดนี้อยู่ ในแง่หนึ่งฉันรู้สึกว่าฉันเริ่มชินกับมันแล้ว แต่เรื่องไร้สาระแบบนี้ทำให้ฉันคิดว่าฉันกำลังถอยหลังไป 3 ก้าว

ความช่วยเหลือทั้งหมดชื่นชม


person Hanny    schedule 19.02.2014    source แหล่งที่มา


คำตอบ (1)


ฉันกำลังสร้างเอนทิตีตามวิธีการของฉันเพื่อรับไมล์ - เมื่อฉันกำจัดสิ่งนั้นออกไป ข้อผิดพลาดก็หายไป

ข้อมูลยังคงบันทึกได้ไม่เหมาะสม แต่นั่นเป็นอีกคำถามหนึ่งโดยสิ้นเชิง

ฉันใส่ความคิดเห็นส่วนนี้เพื่อสร้างเอนทิตี 'ว่าง' ใหม่และเพียงตั้งค่าอาร์เรย์เป็นศูนย์และจัดการว่าจะทำอย่างไรถ้านั่นไม่มีที่อื่นในโค้ดของฉัน

นี่คือวิธีการสำหรับผู้ที่อยากรู้อยากเห็น:

//****GET MILEAGE METHOD****//
- (NSArray *)getMileage {
    //Update the Mileage indicator to display miles between currently selected values
    NSString *begSchool = [_schoolArray1 objectAtIndex:[_tripPicker selectedRowInComponent:0]];
    NSString *endSchool = [_schoolArray1 objectAtIndex:[_tripPicker selectedRowInComponent:1]];
    NSPredicate *milesFilter = [NSPredicate predicateWithFormat:@"beg_school=%@ AND end_school=%@", begSchool, endSchool];
    NSArray *resultMiles = [MetaMiles MR_findAllWithPredicate:milesFilter];
    if (!resultMiles || ![resultMiles count]) {
        //The first load - this displays appropriately in log letting us know there is currently nothing there
        NSLog(@"Empty Array");
        //MetaMiles *emptyInstance = [MetaMiles MR_createEntity];
        //resultMiles = [[NSArray alloc]initWithObjects:emptyInstance, nil];
        resultMiles = nil;
    } else {
        MetaMiles *tripMiles = [resultMiles objectAtIndex:0];
        //This confirms our result miles come out appropriately - they look like this: ("2.1")
        NSLog(@"Our result miles are: %@", tripMiles.miles);
    }
    return resultMiles;
}
//****END GET MILEAGE****//
person Hanny    schedule 19.02.2014