Model yang digunakan untuk membuka toko tidak kompatibel dengan yang digunakan untuk membuat toko

181

Saya membuat model Data Inti dalam xcode 3.2 dan setelah memutakhirkan di Xcode 4.2, saya kemudian menambahkan entitas baru dari subclass NSManagedObject (lihat entitas baru).

Hal pertama, itu terlihat aneh karena tidak berada dalam kelompok yang sama dengan yang lama. Berikut adalah gambar pada xcode saya 4.2 (AlkitabDB adalah yang saya buat di xcode 3.2, EndeDB adalah yang baru dari versi xcode saat ini (4.2):

entitas baru tidak dikelompokkan dalam xdatamodel

Hal kedua, saya membiarkannya apa adanya, lalu saya mengakses entitas kedua (yang baru) dengan cara yang sama dengan entitas pertama (yang lama), dan kesalahan seperti berjudul muncul.

Inilah kesalahannya:

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}

    7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
    8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
    9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

Saya mencari solusi sebelumnya dan menemukan bahwa saya harus menghapus aplikasi dari simulator dan menjalankan kembali aplikasi, dan itu tidak berhasil. Adakah yang tahu solusi untuk masalah ini? Tolong bantu.

dejoong
sumber

Jawaban:

294

Menghapus aplikasi terkadang tidak demikian! Sarankan, aplikasi Anda sudah diterbitkan! Anda tidak bisa hanya menambahkan entitas baru ke basis data dan terus maju - Anda perlu melakukan migrasi!

Bagi mereka yang tidak ingin menggali dokumentasi dan sedang mencari perbaikan cepat:

  1. Buka file .xcdatamodeld Anda
  2. klik Editor
  3. pilih Tambahkan model versi ...
  4. Tambahkan versi baru model Anda (grup datamodels baru ditambahkan)
  5. pilih file utama, buka inspektur file (panel kanan)
  6. dan di bawah Versioned core data modelpilih model data versi baru Anda untuk model data saat ini
  7. ITULAH BUKAN SEMUA) Anda harus melakukan apa yang disebut "migrasi ringan".
  8. Pergi ke Anda AppDelegatedan temukan di mana persistentStoreCoordinatorsedang dibuat
  9. Temukan baris ini if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. Ganti nilopsi dengan @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}(sebenarnya disediakan dalam kode komentar dalam metode itu)
  11. Ini dia, bersenang-senanglah!

PS Ini hanya berlaku untuk migrasi ringan. Agar migrasi Anda memenuhi syarat sebagai migrasi ringan, perubahan Anda harus dibatasi pada pita sempit ini:

  • Tambah atau hapus properti (atribut atau hubungan).
  • Jadikan properti non-opsional menjadi opsional.
  • Buat atribut opsional menjadi tidak opsional, selama Anda memberikan nilai default.
  • Tambah atau hapus entitas.
  • Ganti nama properti.
  • Ganti nama entitas.

Untuk Swift 4

coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
Stas
sumber
2
file utama adalah .xcdatamodel yang Anda buat. Anda harus membuka tab pertama panel Utilities (sisi kanan satu) dan menemukan "Model Version" (Xcode 5.1) dan pilih Current: ".xcdatamodel" yang baru Anda buat "
Stas
1
@ Computer_whiz123, dalam XCode 5.1.1 itu disebut 'Model Version'
Stas
1
Bagaimana saya melakukan ini Swift?
Addison
2
Saya mendapatkan kesalahan ini: "CoreData: error: -addPersistentStoreWithType: Konfigurasi SQLite: (null) URL: file: ///...file.sqlite pilihan: {NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1;} ... error yang dikembalikan Domain = NSCocoaErrorDomain Code = 134130 "Operasi tidak dapat diselesaikan. (Cocoa error 134130.) "
CarmenA
3
Opsi Migrasi Swift:let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
HamzaGhazouani
285

Hapus aplikasi dari simulator dan lakukan pembersihan pada proyek Anda. Itu harus membersihkan masalah-masalah itu. Pastikan Anda tidak menjalankan debugger ketika Anda menghapus aplikasi atau yang lain itu tidak akan benar-benar menghapusnya.

Jika Anda ingin memastikan itu hilang, periksa direktori ini Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/untuk folder aplikasi Anda, di bawah versi yang Anda jalankan.

Catatan: Ini hanya untuk pengembangan. Untuk produksi, Anda perlu menerapkan semacam migrasi. Google "Migrasi Data Inti", dengan migrasi ringan menjadi yang paling sederhana.

Philippe Sabourin
sumber
Terima kasih untuk Philippe, saya mencoba dan tidak berhasil :(, apakah Anda punya saran lain?
dejoong
Bisakah Anda memposting kode yang Anda gunakan buat model dan toko tetap di delegasi aplikasi Anda?
Philippe Sabourin
Agak tidak masuk akal mengapa ini terjadi dan mengapa solusi seperti itu berhasil, tetapi itu .. tidak bisa membantu .. nywaz, inilah suara saya .. yang terbaik yang bisa saya lakukan sekarang untuk menghargai panduan Anda .. terima kasih banyak untuk teman bantuan. !!
Apple_iOS0304
Membantu saya memecahkan masalah di Xcode 4.6, di mana saya mengirim untuk membuang semua file proyek saya secara tidak sengaja: /
ramirogm
6
Ini hanya untuk pengembangan! Untuk produksi, Anda menggunakan versi model dan migrasi. developer.apple.com/library/ios/#documentation/cocoa/Conceptual/…
Philippe Sabourin
35

Cukup tambahkan atribut Opsi sambil membuat persistentStoreCoordinator di file AppDelegate.m untuk metode data inti seperti di bawah ini

TUJUAN-C

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }

    NSLog(@"persistentStoreCoordinator___");
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];

    NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    NSLog(@"persistentStoreCoordinator___2");
    return _persistentStoreCoordinator;
}

CEPAT

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    var failureReason = "There was an error creating or loading the application's saved data."

    // MAIN LINE OF CODE TO ADD
    let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
                    NSInferMappingModelAutomaticallyOption: true]

    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}

Itu telah memecahkan masalah saya ..

Dhaval H. Nena
sumber
1
Terima kasih atas posting ini, sangat membantu
Subramani
23

Jawaban: Hapus aplikasi dari Simulator, Lakukan Bersih dan Bangun Kembali Proyek Anda.

Catatan: Setiap kali Anda melakukan perubahan pada definisi Data Inti, Hapus aplikasi yang diinstal pada Perangkat Fisik atau Simulator, Bersihkan Proyek dan Bangun Kembali.

Bhavin
sumber
Menyetel ulang konten dan pengaturan di simulator memperbaiki masalah untuk saya! Terima kasih.
septerr
14

Iya. Setelah Anda menghapus aplikasi pada perangkat fisik dan membangunnya kembali berfungsi.

world-software.net
sumber
Ini sebenarnya memecahkan masalah saya daripada jawaban yang diterima. Terima kasih!
Ken W
apa yang terjadi dalam produksi bukan jawabannya
Eduardo Oliveros
Ini adalah jawaban yang mengerikan, Anda perlu menambahkan migrasi ke model baru Anda jika tidak aplikasi akan macet di prod
aryaxt
14

Untuk cepat, di AppDelegate.swift temukan baris

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration:  nil, URL: url, options: nil )

dan ganti dengan

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
Ali Asgher Lakkadshaw
sumber
11

Saya hanya menghabiskan waktu beberapa hari untuk mengatasi kesalahan ini, dan juga kesalahan mergerModelFromBundles, dan mendapatkan kesalahan "Tidak dapat menggabungkan model dengan dua entitas berbeda bernama *".

Ternyata masalah root adalah Xcode tidak menghapus sumber daya lama dari perangkat dan saya memiliki versi lama model data saya (file .mom) yang menyebabkan konflik. Inilah sebabnya mengapa menghapus aplikasi memperbaiki masalah di salah satu perangkat saya.

Setelah menemukan posting blog ini melalui jawaban SO lainnya, saya membuat aplikasi saya lebih toleran terhadap model lama dengan mengubah baris ini yang mencari SEMUA file .mom:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

untuk ini, yang hanya terlihat di direktori Filter:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

Saya menggunakan recursivePathsForResourcesOfType dari pertanyaan ini : untuk membantu memecahkan masalah ini dengan masuk ke semua file .mom di aplikasi:

NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]];
NSLog(@"All .mom files:%@",momPaths);

Saya juga menggunakan iExplorer untuk melihat file .mom yang asing (saya belum mencoba menghapusnya).

Metode di bawah ini juga bermanfaat. Ini menunjukkan bahwa suatu entitas berada dalam model gabungan yang dikembalikan oleh [psc managedObjectModel] yang tidak ada lagi di salah satu model saya atau di toko itu sendiri. Inilah yang membuat saya percaya bahwa model lama sedang di-cache pada perangkat itu sendiri bahwa bangunan bersih tidak dihapus. Metode mencatat setiap entitas yang sama, telah diubah, atau ditambahkan, atau dihapus dari model. (ditulis dengan jawaban SO ini sebagai titik awal):

- (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL {
    NSError *error = nil;

    // Get the entities & keys from the persistent store coordinator
    NSManagedObjectModel *pscModel = [psc managedObjectModel];
    NSDictionary *pscEntities = [pscModel entitiesByName];
    NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]];
    //NSLog(@"psc model:%@", pscModel);
    //NSLog(@"psc keys:%@", pscKeys);
    NSLog(@"psc contains %d entities", [pscModel.entities count]);

    // Get the entity hashes from the storeURL
    NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                                          URL:storeURL
                                                                                        error:&error];
    NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"];
    //NSLog(@"store metadata:%@", sourceMetadata);
    NSLog(@"store URL:%@", storeURL);
    NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]);
    NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]);
    NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]];

    // Determine store entities that were added, removed, and in common (to/with psc)
    NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys];
    NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *changedEntities = [NSMutableSet new];
    [addedEntities minusSet:storeKeys];
    [removedEntities minusSet:pscKeys];
    [commonEntities minusSet:removedEntities];
    [commonEntities minusSet:addedEntities];

    // Determine entities that have changed (with different hashes)
    [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
        NSData *storeHash = [storeHashes objectForKey:key];
        NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
        if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) {
            if (storeHash != nil && pscDescrip.versionHash != nil) {
                [changedEntities addObject:key];
            }
        }
    }];

    // Remove changed entities from common list
    [commonEntities minusSet:changedEntities];

    if ([commonEntities count] > 0) {
        NSLog(@"Common entities:");
        [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([changedEntities count] > 0) {
        NSLog(@"Changed entities:");
        [changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\tpsc   %@:\t%@", key, pscDescrip.versionHash);
            NSLog(@"\tstore %@:\t%@", key, storeHash);
    }];
    }
    if ([addedEntities count] > 0) {
        NSLog(@"Added entities to psc model (not in store):");
        [addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([removedEntities count] > 0) {
        NSLog(@"Removed entities from psc model (exist in store):");
        [removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSLog(@"\t%@:\t%@", key, storeHash);
        }];
    }

    BOOL pscCompatibile = [pscModel isConfiguration:nil     compatibleWithStoreMetadata:storeMetadata];
    NSLog(@"Migration needed? %@", pscCompatibile?@"no":@"yes");

    return pscCompatibile;
}

penggunaan: dipanggil sebelum menambahkan setiap toko ke NSPersistentStoreCoordinator:

    [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL];
    _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType
                                          configuration:nil
                                                    URL:self.iCloudStoreURL
                                                options:options
                                                  error:&localError];
Simetris
sumber
10

Setiap kali Anda membuat perubahan ke definisi Tanggal Inti, Anda harus menghapus aplikasi yang diinstal pada perangkat fisik atau simulator.

pierrotlefou
sumber
20
Bagaimana dengan aplikasi produksi? Apakah mereka akan langsung macet jika Anda mendorong pembaruan ke App Store dengan perubahan pada Data Inti? Thx
rlandland
3
Ya, perubahan pada model CD mencegah data yang dihasilkan oleh model sebelumnya tidak dimuat. Untuk menangani ini, Anda perlu mendeteksi masalah dan melakukan Migrasi Data Inti.
Johan
8
  1. Hentikan aplikasi agar tidak berjalan.
  2. Hapus aplikasi pada simulator.
  3. Product -> Clean
  4. Bangun, jalankan.
Tom Howard
sumber
4
praktik buruk dalam produksi, matikan aplikasi
Eduardo Oliveros
7

Solusi paling sederhana yang bekerja untuk saya di Swift 2.1, Xcode 7 adalah:

  1. Hapus aplikasi dari Simulator (Cmd + Shift + H untuk membuka Layar Beranda. Tekan lama aplikasi, Klik silang, seperti cara biasa Anda menghapus aplikasi dari telepon Anda)

  2. Cmd + Shift + H lagi untuk menghentikan dansa aplikasi

  3. Kembali ke proyek Anda dan jalankan kembali

Saya mengalami masalah ini saat menulis / membaca dari Core Data dengan 2 entitas yang diatur. Menghapus aplikasi dan menjalankan kembali program memperbaiki masalah

Naishta
sumber
2
praktik buruk dalam produksi, matikan aplikasi
Eduardo Oliveros
6

Saya baru saja menghapus [Simulator App Folder]/Document/*.sqlitefile setelah membuat perubahan pada entitas dan itu berhasil. Dan tentu saja, file .sqlite berisi semua data yang tersimpan dan struktur yang akan hilang.

AHHP
sumber
2
Bekerja untuk saya juga. Tampaknya masuk akal bahwa ini sudah cukup. Anda kehilangan semua data yang sudah ada di DB ...
bor
6

Silakan Hapus aplikasi dari simulator dan bersihkan kode dan jalankan. Itu berfungsi dengan baik. Lakukan itu mungkin membantu ANDA.

sarit bahuguna
sumber
6

Jika Anda menggunakan Swift.

Ikuti jawaban dengan @Stas dan masukkan opsi, sebagai ganti nol, di Delegasi Aplikasi Anda:

let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {
JZ.
sumber
1
Tidak yakin mengapa itu ditolak, tetapi saya sudah benar. Terima kasih telah menyediakan sintaks untuk Swift.
Matt Long
Bagus! Itu berhasil! Terima kasih! Saya mencoba menyelesaikan masalah ini selama 3 jam.
mr_ivan777
di mana harus meletakkan kode ini? i memuat data inti dengan kode ini, biarkan wadah = NSPersistentContainer (nama: "modeldb") container.loadPersistentStores (completionHandler: {(storeDescription, error) di if let error = error sebagai NSError? {
MAS. John
5

Coba "Setel Ulang Konten & Pengaturan" di simulator. Bekerja untuk saya setelah menghapus aplikasi dan Clean build

Josh10
sumber
3
Namun, jika Anda melakukan ini, bukankah masalah yang sama akan tetap terjadi pada pengguna di mesin nyata?
Maury Markowitz
4

Saya mengalami masalah yang sama dengan aplikasi saya (belum dirilis di App Store).

Begini cara saya memperbaikinya:

  1. Jalankan Bersih (Cmd + Shift + K)
  2. Mulai ulang iOS Simulator
  3. iOS Simulator -> Reset Konten dan Pengaturan (dari navbar)

(3) adalah langkah yang akhirnya membuatnya berjalan dengan baik. Semoga ini membantu!

bigtex777
sumber
2

Meskipun kadang-kadang Anda hanya dapat menghapus aplikasi dari perangkat ketika mengubah skema dalam model objek yang dikelola, dalam beberapa skenario ini tidak mungkin misalnya karena Anda sudah menerbitkan aplikasi Anda dengan skema lama.

Jika ini masalahnya, Anda harus mengurus migrasi data lama ke skema baru:

Versi Inti Model Data dan Migrasi Data

Mike
sumber
2

Jika Anda membuat perubahan pada model Data Inti Anda, Anda harus memberikan kebijakan migrasi yang memberi tahu Data Inti cara mengadopsi objek yang ada yang sudah ada (yang dibuat pengguna Anda dengan versi yang saat ini dirilis) ke model baru.

Untuk beberapa skenario, Data Inti dapat secara otomatis menyimpulkan pemetaan dari model lama ke yang baru. Untuk perubahan yang lebih kompleks, Anda mungkin harus menerapkan beberapa logika yang melakukan migrasi.

Detail dapat ditemukan di Panduan Pemodelan Model Data Inti dan Migrasi Pemrograman Data .

Perbarui
Jawaban ini di Stack Overflow yang mencakup dasar-dasar migrasi ringan Core Data dan juga memiliki beberapa kode untuk Anda mulai.

Thomas Zoechling
sumber
Ini jawaban saya untuk hal yang sama untuk migrasi data: stackoverflow.com/questions/8881453/…
Dhaval H. Nena
1

Masalah ini umumnya terjadi karena ketidakcocokan antara versi tempat DB dibuat. Pendekatan umum untuk masalah ini adalah menghapus aplikasi dan menginstalnya kembali. Tetapi dalam kasus Anda yang disebutkan versi DB benar-benar berbeda pada Xcode 3.2 dan 4.2. Jadi lebih baik gunakan versi Xcode yang sama untuk DB.

Jayprakash Dubey
sumber
1

Pertama, satu-satunya hal yang harus ada dalam xcdatamodeldbundel adalah xcdatamodelfile. Subkelas Anda TIDAK boleh berada di xcdatamodeld. Pindahkan mereka dari sana. Ada kemungkinan mereka membingungkan kompiler.

Kedua, kesalahan menunjukkan bahwa Data Inti tidak dapat menemukan model Anda. Sudahkah Anda membuat data dan kemudian menyentuh model? Jika demikian, Anda berada dalam kondisi tidak konsisten dan perlu memperbaikinya dengan menghapus data (yang disarankan Philippe) atau dengan menggulirkan perubahan model BACK .

Marcus S. Zarra
sumber
apakah Anda punya ide bagaimana saya bisa mengeluarkan model dari bundel xcdatamodel? atau shd saya hanya menghapusnya?
dejoong
Model, yang merupakan xcdatamodelfile harus ada di sana. File .h dan .m yang perlu dipindahkan. Gunakan Finder.
Marcus S. Zarra
0

Saya mendapatkan kesalahan tetapi alasan saya mendapatkan kesalahan adalah karena hal berikut.

Saya awalnya memiliki satu Entitas bernama "Entri" dan satu baris disimpan untuk entitas itu dalam database. Saya kemudian menambahkan Entitas lain bernama "Orang" dan setelah menambahkan itu pergi untuk membangun dan mendapat kesalahan. Jadi saya memecahkan masalah dengan menghapus Entitas "Orang" dan kemudian membangun aplikasi, menghapus baris yang ada di "Entri" dan kemudian menutup aplikasi. Saya kemudian menghapus aplikasi sepenuhnya dari ponsel saya dan kemudian melakukan pembangunan kembali dan berfungsi dengan baik. Tidak yakin langkah mana yang memperbaiki masalah (penghapusan baris atau aplikasi), tetapi mudah-mudahan jika Anda mencari solusi, ini akan membantu. :)

Sunting: Oh dan jika Anda khawatir menghapus Entity baru Anda (dalam kasus saya "Person") untuk membangun aplikasi lagi ingat Anda bisa mendapatkannya kembali setelah itu dengan menggunakan CMD + Z!

daveomcd
sumber
0

Saya punya masalah ini - saya pertama-tama mengatur ulang simulator saya dan kemudian membersihkan proyek dan membangun kembali. Dan kemudian berhasil.

Yashu
sumber
0

Ketika Anda mengubah data inti, (menambahkan bidang ke tabel, menghapus bidang dll), file sqlite dalam folder dokumen aplikasi harus disinkronkan dengan skema Anda.

File ini tidak ditimpa secara default, file ini perlu dibuat ulang.

Ikuti langkah ini:

  1. Buka folder yang ditunjuk oleh NSURL. (Jalur ini dapat ditemukan dalam pesan pengecualian yang dihasilkan oleh aplikasi sebelum mogok.) Contoh: / Pengguna // Dukungan Perpustakaan / Aplikasi / iPhone Simulator // Aplikasi // Dokumen

  2. menghapus atau mengganti nama file sqlite

  3. Bersihkan dan jalankan kembali aplikasi
  4. Aplikasi rerunning akan menghasilkan file sqlite baru.

Ini akan memastikan bahwa skema dan Xcode sinkron.

Prashant Nidgunde
sumber
-1

Untuk pengembangan aplikasi mac:

  1. Bersihkan proyek
  2. Bersihkan data turunan
  3. Pergi ke / Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents / dan hapus semua file di dalamnya (seperti ".sqlite", ".sqlite-shm" ...)

Ini bekerja untuk saya, semoga ini bisa membantu.

Eneko
sumber
-2

Simulator iOS -> Setel Ulang Konten dan Pengaturan ...

Bekerja untukku

iOS Simulator -> Reset Konten dan Pengaturan ... -> Reset Bekerja pada iOS9 (xcode 7.1) juga

niravdesai21
sumber
4
praktik buruk dalam produksi, matikan aplikasi
Eduardo Oliveros