Simpan entitas dengan MagicalRecord - mencoba menyelamatkan entitas lain juga?

Aplikasi saya telah diatur sehingga mengambil daftar hal-hal dari satu entitas (daftar lokasi (sekolah)) dan memasukkannya ke dalam pemilih di dalam tampilan saya.

Dalam tampilan, pengguna memilih lokasi dan jarak tempuh secara otomatis dihasilkan (disetel di dalam entitas yang sama tempat kita mendapatkan lokasi).

Ketika mereka mengklik "simpan entri", saya ingin menyimpannya ke entitas lain di coredata dan saya yakin saya telah mengaturnya untuk melakukan itu dengan benar, tetapi ini memicu kesalahan ini:

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'

Saya mengaturnya untuk menggemakan setiap hal yang harus disimpan ke dalam entitas (hanya untuk pengujian, untuk memastikan ia mengambil data yang sesuai) dan sesuai log - saya dapat melihat bahwa ia mendapatkan data yang sesuai. Namun bagian kedua sepertinya mencoba menyimpan rekor MetaMiles juga. Saya tidak ingin melakukan ini. Entitas MetaMiles hanyalah entitas tempat saya mendapatkan data - tidak perlu dilakukan penyimpanan apa pun. Bagaimana cara saya menentukan hanya untuk menyimpan entitas UserMiles dan TIDAK menyimpan entitas MetaMiles (tempat saya mengambil informasi dari aslinya)?

Kode tombol saya terlihat seperti ini:

//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];
}

Tidak terlalu paham dengan CoreData karena saya masih mempelajari semua ini. Di satu sisi aku merasa sudah mulai terbiasa, tapi kemudian hal-hal konyol seperti ini membuatku berpikir aku mundur 3 langkah.

Semua bantuan dihargai.


person Hanny    schedule 19.02.2014    source sumber


Jawaban (1)


Saya membuat entitas dalam metode saya untuk mendapatkan jarak tempuh - setelah saya menghilangkannya, kesalahannya hilang.

Datanya masih belum disimpan dengan benar, tapi itu pertanyaan lain.

Saya mengomentari bagian untuk membuat entitas 'kosong' baru dan hanya mengatur array ke nihil dan menangani apa yang harus dilakukan jika itu nihil di tempat lain dalam kode saya.

Berikut caranya bagi yang penasaran:

//****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