Pertanyaan Coredata - "NSObjectInaccessibleException - CoreData tidak dapat memenuhi suatu kesalahan"


Saya baru untuk data Core dan masih mencari tahu mur dan baut dan kesalahan ini telah mengganggu saya selama berjam-jam dan saya tidak bisa menemukan solusi. Bantuan apa pun sangat dihargai.

Masalahnya seperti ini

Saya memiliki dua tampilan yang mengambil data dari server dan Perbarui UI. Saya telah menyiapkan aliran dengan cara ini

view1 -> Kirim HTTP Req dari Server - Terima Callback -> Simpan Data Untuk Coredata -> Baca Dari Data Inti dan tampilan pada UI (callback dan menyimpan / membaca Coredata terjadi di ViewController)

view2 -> Kirim HTTP Req dari Server - Terima Callback -> Simpan Data Untuk Coredata -> Baca Dari Data Inti dan tampilan pada UI (callback dan menyimpan / membaca Coredata terjadi di ViewController)

Tampilan 2 mengulang proses ini setiap 3 detik karena ini adalah layar penyegaran otomatis.

Masalahnya adalah setiap kali saya mencoba beralih antara tampilan 1 dan 2 sangat cepat, itu membuat aplikasi crash dengan kesalahan di atas. Jika saya menunggu beberapa detik pada setiap tampilan (menunggu data diambil dari server), ini berfungsi dengan baik. Apakah saya melakukan kesalahan, apa yang perlu saya ubah?

- (void) refreshData {
    [super refreshData];
    [[UserDataFactory sharedSingleton] refreshLoggedInUserDataAndRespondTo:self user:self.user];
}

- (BOOL) refreshDataCallback:(QExtendedHTTPOperation*)responseOperation {
    [self saveToCoreData: responseOperation.responseArray];
    NSMutableArray *tmp = [[NSMutableArray alloc] initWithArray:[self readFromCoreData]];
    [self setData: tmp];
    [tmp release];
    [self.tableView reloadData];
    return YES;
}

- (void) saveToCoreData:(NSArray *) responseArray{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    NSError *error;
    NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    [fetchRequest release];

    for (NSManagedObject *managedObject in items) {
            [self.managedObjectContext deleteObject:managedObject];
    }

    for (int i=0; i<[responseArray count]; i++) {
            CoreView1 *coreView1_ = [NSEntityDescription insertNewObjectForEntityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
            coreView_.id = [[responseArray objectAtIndex:i] id];    
            [self.managedObjectContext insertObject:coreView1_];
    }
    [self saveContext:self.managedObjectContext];
}

- (NSArray *) readFromCoreData{ 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    NSError *error;
    NSMutableArray *fetchedObjects = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
    [fetchRequest release];
    return [fetchedObjects autorelease];
}

Ini adalah kode contoh yang saya gunakan, bahkan View2 memiliki callback yang sama dan mengikuti alur yang sama.

Edit 1 Lupa menyebutkan ini sebelumnya, saya selalu mendapatkan kesalahan dalam metode saveToCoreData. Juga, satu hal lagi yang perlu diperhatikan adalah bahwa Jika saya menghapus kode untuk menghapus objek semuanya berfungsi dengan baik (saya harus menghapus semua data yang ada dari tabel sebelum saya menyimpan data yang diperbarui). Tidak yakin apa yang terjadi.


32
2018-04-08 06:30


asal


Jawaban:


Alasan penghapusan kode hapus Anda membuatnya berfungsi adalah karena Anda menghapus data di penyimpanan persisten tanpa memperbarui tampilan lain yang masih mengatur instance objek yang terkait dengan data tersebut masih dalam memori. Ingat, ketika Data Inti berhubungan dengan objek, setiap objek harus memiliki baris dalam database di belakangnya. Ketika Anda menghapus baris itu, Data Inti menjadi marah.

Jadi, untuk memperbaiki masalah ini, dan masih menghapus data Anda, Anda harus mendengarkan pandangan Anda NSManagedObjectContextWillSaveNotification dan / atau NSManagedObjectContextDidSaveNotification pemberitahuan dan perbarui pandangan Anda dengan versi data terbaru di toko Anda. Pada titik ini Anda harus membuang objek Core Data apa pun yang dipegang oleh pandangan Anda, dan memuatnya kembali dari toko.


42
2018-04-19 21:26



Saya baru saja menyelesaikan kesalahan ini dalam kode saya. Sepertinya cache saya rusak dalam beberapa cara. Saya menggunakan saran Christopher Pickslay & Keil Gillard untuk menghapus atau mengganti nama cache saya, dan voila, crash diselesaikan. Indeks NSFetchedResultsController melampaui batas


3
2018-01-04 00:52



Untuk info, kemarin, saya mengalami kesalahan yang sama. Saya sudah memeriksa versi live dari aplikasi, dan masih ada di sana. Astaga.

Saya berlari melalui semua permutasi menambahkan info ke tumpukan data inti sampai kecelakaan itu terjadi.

Saya kemudian melihat file sqlite dari aplikasi di perpustakaan simulator menggunakan SqliteManager. Saya menemukan kesalahan data dalam satu tabel. Ini terjadi karena ada starter db digunakan pertama kali aplikasi dijalankan. Kesalahan berada di db starter.

Jalankan lagi aplikasinya, uji setiap bidang di setiap tabel. Ditemukan beberapa kejadian lagi. Saya ingat pernah membaca pertanyaan ini, dan berpikir mungkin orang lain bisa mendapat manfaat dari kesalahan saya.


0
2017-09-29 11:54



Anda terlalu banyak melepaskan diambilObjects di dalam kamu readFromCoreData metode. executeFetchRequest akan kembali kepada Anda objek autoreleased pula. Ketika loop run saat ini selesai mengeksekusi (ketika Anda melompat dari pandangan) kemudian mencoba untuk melepaskan objek dua kali (dengan asumsi Anda belum menggunakan kolam autorelease Anda sendiri).

Saya akan berubah

return [fetchedObjects autorelease]; 

untuk

return fetchedObjects;

-1
2018-04-08 06:42