Tidak dapat membuat NSPersistentStoreCoordinator dengan model nihil


96

Telah mengalami crack pertama saya di Core Data dan saya mendapatkan kesalahan berikut saat menjalankan kode saya di perangkat saya, tetapi berfungsi dengan baik di simulator ..

* Menghentikan aplikasi karena pengecualian yang tidak tertangkap 'NSInvalidArgumentException', alasan: 'Tidak dapat membuat NSPersistentStoreCoordinator dengan model nihil'

Beberapa metode saya yang mungkin menyebabkan masalah:

    - (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created from the application's model.
 */
- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return __managedObjectModel;
}

/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"RugbyOnTV.sqlite"];

    NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];    
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

    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();
    }    

    return __persistentStoreCoordinator;
}


    - (NSString *)applicationDocumentsDirectory {

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
        return basePath;
    }

EDIT

Saya menyalin dan menempelkan metode managedObjectContext (di bawah) dari CoreDataBooks Apple dan sekarang berfungsi..Tidak begitu yakin mengapa

- (NSManagedObjectModel *)managedObjectModel {
    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}

Hai, ini bisa sesederhana menambahkan kata "Model" ke parameter URLForResource pertama .... ya, saya mengalami masalah yang sama. Kemudian saya memeriksa konten .app yang sebenarnya di baris perintah dan menemukan bahwa .momd sebenarnya sedang dibuat. Jadi coba ini: [[NSBundle mainBundle] URLForResource: @ "RugbyOnTvModel" withExtension: @ "momd"];
PostCodeism

NSString *basePath = [paths firstObject];
William Entriken

Jawaban:


157

Saya mendapat pesan kesalahan yang sama persis dengan postingan asli. Saya bergumul dengan ini selama berjam-jam. Itu adalah baris ini di AppDelegate.m saya.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];

Bagi siapa pun di luar sana yang mencari pesan kesalahan ini dan menemukan utas ini .... coba ini dulu.

Anda harus memastikan bahwa di mana dikatakan [sama dengan nama xcdatamodeld] .... itu !!! Untuk beberapa alasan, nama proyek saya ada di sana dan bukan nama model datanya.

Menggantinya dan langsung bekerja .....

Terima kasih kepada Rock & Muller untuk kontribusinya ....... Anda menyelamatkan saya berhari-hari !!

Gaz.


2
Ini adalah komentar yang membuatnya berhasil untuk saya. Nama ajaib yang dicari aplikasi saya berasal blahdari blah.xcdatamodeld. Terima kasih internet, dan stackoverflow.
acedanger

Saya memiliki "Model.xcdatamodeld", diubah menjadi "Model" sebagai argumen. Tetapi Xcode menolak untuk memuatnya, tetapi file ini sebenarnya ada di sana! Saya tidak tahu, apa yang terjadi.
Darmen Amanbayev

Wow. Terima kasih membenturkan kepalaku untuk sementara waktu.
Sani Elfishawy

bagaimana dengan storeURL satu?
MoralCode

54

verifikasi pertama:

NSLog(@"%@", [self managedObjectModel]);

Jika Anda mendapatkan nilai nihil mungkin masalahnya ada di sini

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];

Jadi, coba ubah @ "momd" dengan @ "mom"


1
Kanan Anda. Nol dan baris ini menyebabkan kesalahan: `__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alokasi] initWithManagedObjectModel: [self managedObjectModel]];` Mengubah menjadi mom sepertinya tidak memperbaiki apa pun
Dominic Williams

3
Kemungkinan besar modelURLjuga nil. Penyebab paling umum adalah kesalahan ketik RugbyOnTv. Perhatikan bahwa ini peka huruf besar-kecil.
Rob Napier

1
Mengubah "momd" menjadi "mom" juga berhasil untukku. Terima kasih. Tapi kenapa? Mengapa Xcode menghasilkan kode yang tidak berfungsi? Mengapa saya menemukan perbaikan yang tidak jelas seperti ini di SO agar template dasar berfungsi?
Rhubarb

10
Setelah baru-baru ini memperkenalkan versi ke-2 model saya, saya harus mengubahnya kembali ke momd. Mengingat bahwa wadah versi model memiliki ekstensi xdatamodeld, saya pikir kita dapat menyimpulkan apa yang terjadi di sini. "momd" adalah untuk model dengan lebih dari satu versi sedangkan "mom" untuk model yang tidak memiliki versi.
Gerald

2
Saya menyalin kode ke dalam proyek baru [iOS7] kata demi kata dan itu awalnya ibu tetapi mengubah ke ibu memperbaikinya. Saya tidak tahu bagaimana saya akan menemukan solusi tanpa ini, jadi terima kasih :)
Ian Clay

20

Saya mengalami masalah aneh dengan Xcode 4.3.2 dan iOS 5.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"momd"];

mengembalikan URL yang valid tetapi

__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

mengembalikan NSManagedObjectModel null. Tetapi setelah memeriksa dokumentasi , sepertinya NSManagedObjectModel membutuhkan file dimana NAME_OF_THE_MODEL.momd adalah direktori yang berisi file NAME_OF_THE_MODEL.mom. Mengubah URL menjadi

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"mom" subdirectory:@"NAME_OF_THE_MODEL.momd"];

kemudian bekerja. Tampaknya aneh bahwa Xcode menghasilkan kode yang tidak bekerja dengan sendirinya ...


1
Masalah khusus ini disebabkan oleh pembuatan versi model tambahan dan kemudian mencoba untuk menghapusnya secara manual saat Xcode terbuka. Ini menyebabkan beberapa jenis korupsi. Anda tidak boleh meneruskan versi model tertentu di direktori momd.
Mike Weller

keren @MikeWeller, senang mengetahuinya. Apakah Anda tahu di mana metadata yang mengarah ke file mom di direktori momd?
xster

Saya tidak mencoba menghapusnya, tetapi saya memiliki masalah ini dan solusi yang diposting bekerja untuk saya, khususnya, saya baru saja menambahkan tanda centang untuk melihat apakah masih nihil dan jika saya menambahkan kode di atas: if (_managedObjectContext == nihil) {NSURL * modelURL = [[NSBundle mainBundle] URLForResource: @ "Model" withExtension: @ "mom" subdirektori: @ "Model.momd"]; _managedObjectModel = [[NSManagedObjectModel alokasi] initWithContentsOfURL: modelURL]; }
David van Dugteren

19

Saya mengalami masalah ini dan mengubah "ibu" menjadi "ibu" tidak melakukan apa-apa. Untuk memperbaikinya saya harus mengklik kanan pada file xcdatamodelId> tampilkan isi paket lalu hapus file .xcurrentversion yang tersembunyi.

PS: Masalah ini baru mulai terjadi setelah saya mengubah nama file model data.


2
Untuk semua orang yang mengalami masalah berikut: managedObjectModel menjadi nol setelah mengganti nama file xcdatamodeld: jawaban ini adalah yang terbaik! Terima kasih JDx, jawaban Anda sangat membantu saya!
Dumoko

Alih-alih menghapusnya, Anda akhirnya dapat mengeditnya untuk mengubah nama file yang disimpan ke versi terbaru youl xcdatamodel
furins

13

Sumber lain dari kesalahan ini, terkadang Xcode tidak menyertakan model data dalam build.

Periksa Build Phases target Anda, dan pastikan file * .xcdatamodeld disertakan di bagian Compile Sources.


Ini memperbaikinya untuk saya.
Ben Thomas

ini berhasil untuk saya. Ini membuat frustrasi dan sulit untuk men-debug ketika bekerja di Simulator dan bukan di perangkat nyata!
Bishal Ghimire

9

Apa yang mungkin terjadi adalah file xcdatamodeld Anda dari kode sumber Apple telah berubah menjadi file xcdatamodel (tanpa d) dan oleh karena itu mereka tidak dianggap sama.

Cara tercepat untuk memperbaikinya, adalah dengan memilih file xcdatamodel di navigator proyek Anda dan masuk ke bilah menu

Editor->Add Model Version...

dan tambahkan versi baru model Anda. Lakukan semua perubahan ke versi baru.

Ini berfungsi di Xcode 5


sayangnya opsi ini tidak ada di Xcode 5 .. lihat di sini
abbood

Lupa menyebutkan bahwa Anda perlu memilih file xcdatamodel. Jawaban diedit untuk mencerminkan komentar.
Louis Cremen

8

Saya menyelesaikannya dengan menambahkan file db ke file Copy Bundle Resources.

Pergi ke root proyek Anda >> pilih target Anda >> Build Phases >> Copy Bundle Resources. Pastikan file xcdatamodeld Anda telah ditambahkan di sini.

masukkan deskripsi gambar di sini

Tidak ada solusi yang diposting yang berhasil untuk saya. Jadi, semoga postingan ini membantu seseorang di luar sana. Aplikasi saya hanya mogok dalam rilis build btw. Pelajaran yang dipelajari. Selalu uji rilis build!

BTW, saya menemukan posting SO ini https://stackoverflow.com/a/6708837/951349 yang paling membantu .


6

saya mendapat masalah yang sama dengan @Dominic Williams

coba ubah nama file momd di bawah ini (Anda dapat menemukan ini dalam managedObjectModelmetode secara default), yang sama dengan [file name].xcdatamodeldfile yang Anda buat:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];

5

Saya memiliki masalah yang sama. Solusinya adalah campuran dari 2 jawaban:

1) Saya harus menambahkan parameter "subdirektori" ke dalam panggilan URLForResource

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DATAMODEL_NAME" withExtension:@"mom" subdirectory:@"DATAMODEL_NAME.momd"];

2) Untuk alasan yang saya tidak tahu, model data tidak disertakan saat proyek dikompilasi. Saya harus menambahkannya secara manual ke dalam "Build Phases / Compile resources".

Dengan hanya satu dari solusi di atas, aplikasi saya tidak berfungsi.


4

Solusi untuk masalah yang Anda bicarakan itu sederhana. Ubah ekstensi file menjadi "mom" bukan "momd" di URL model. Selesai.


4

Saya mencoba semua solusi di sini, dan tidak ada yang berhasil. Masalah saya muncul setelah saya mengganti nama proyek. Ternyata, Xcode terus mencari file momd lama di tempat yang salah selama kompilasi.

Bagi siapa pun yang mencoba semua solusi di atas tanpa hasil, coba periksa jalur lengkap .xcdatamodeldfile Anda . Itulah yang berhasil bagi saya.


4

Saya memiliki masalah yang sama, ini berfungsi dengan baik di iOS6 tetapi tidak di iOS5. Beginilah cara saya menyelesaikannya:

  1. Buat versi Model baru di xcode. (pilih .xcdatamodeld, buka menu Editor dan klik "Tambahkan Versi Model ...")
  2. Kompilasi dan pastikan versi baru berfungsi.
  3. Tetapkan yang lama sebagai versi saat ini. ("Saat Ini" di Pemeriksa File untuk .xcdatamodeldModel Data Inti Berversi di bawah)
  4. Hapus referensi ke .xcdatamodeldfile di xcode
  5. Klik kanan .xcdatamodeldfile di Finder dan pilih "Show Package Contents"
  6. Hapus yang baru .xcdatamodelyang tidak Anda inginkan
  7. Tambahkan kembali .xcdatamodeldin xcode
  8. Kompilasi dan tersenyumlah

(Di sinilah saya menemukan cara menghapus versi Model: Cara menghapus Versi Model Data lama / tidak terpakai di Xcode )


Tack så mycket! Ini sangat membantu.
Michael Dorner

4

Saya menyelesaikan masalah tanpa mengubah kode apa pun.

Saya menambahkan ModelName.xcdatamodeld melalui File-> Tambah File alih-alih menyeret file ke Xcode.

 NSString *path=@"ModelName";

NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"momd"]];

model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

1

Di sisi saya, masalahnya adalah saya telah mengubah kasus beberapa karakter dalam nama database.

Saat memulai proyek baru, Xcode secara otomatis mengatur semuanya dari nama proyek. Jika Anda mulai memanggil proyek Anda "Rugbyontv" dan kemudian memutuskan untuk mengubah ke "RugbyOnTV" dan melakukan pencarian dan penggantian, itu akan merusaknya. (Penghargaan untuk Rob karena menunjukkan bahwa nama peka huruf besar / kecil)


1

Saya telah mencari jawaban selama berjam-jam dan tidak ada yang berhasil. Tapi kemudian saya tiba-tiba menemukan artikel ini . Jadi menurut ini, masalahnya ada pada pengaturan pengontrol root di bagian AppDelegate.m ini:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    ListViewController *rootView = (ListViewController *)self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext;
    return YES;
}

Sebenarnya Anda harus menentukan pengontrol root apa yang akan mendelegasikan koneksi CoreData Anda. Dan dalam kasus saya, saya memiliki TabBarController yang terhubung ke tampilan lain, jadi pengontrol root tampilan yang ditagih saya didefinisikan sebagai TabBar dan itu menyebabkan kesalahan. aku berubah

ListViewController *rootView = (ListViewController *)self.window.rootViewController;

untuk

ListViewController *rootView = (ListViewController *)self.window.superview;

dan semuanya bekerja.


1

Saya tahu ini tidak menyelesaikan masalah Anda, tetapi saya mengalami masalah ini kemarin yang mengganggu saya selama berjam-jam, solusi yang diposting @Dominic Williams memberi saya ArrayIndexOutOfBoundsException (apa pun yang setara dengan Objective-C).

Saya belum terlalu mahir menggunakan Objective-C / Xcode, tetapi saya sedang mengerjakan aplikasi iOS yang (kebanyakan) dikembangkan oleh perusahaan kami secara eksternal. Sayangnya, mereka sering lupa bagaimana menggunakan keyboard dan akan menggunakan huruf kapital secara bergantian atau properti ejaan yang salah tetapi terlalu malas untuk kembali dan mengubahnya. Mereka telah menggunakan huruf kapital dalam nama proyek xcode yang tidak seharusnya (nama produk kami tidak menggunakan huruf kapital) dan saya harus kembali dan mengubah setiap kemunculan huruf besar ini menjadi huruf kecil ; yang menyertakan nama proyek, file data inti, ratusan variabel, dll.

Bagaimanapun, setelah saya melakukan ini, saya mengalami kesalahan ini dan tidak ada solusi yang memperbaikinya untuk saya. Saya telah memastikan bahwa semua nama URL benar, proyek dibersihkan, aplikasi dicopot, telepon dimulai ulang, dll tanpa hasil. Saya menyerah dan mematikan Mac saya dan pulang untuk hari itu. Yang mengejutkan saya, saya kembali pagi ini dan semuanya tampak bekerja dengan baik!

Saya tidak tahu mengapa ini berhasil tetapi jika Anda macet, coba mulai ulang Mac Anda.


1

Jika seseorang terjebak karena masalah yang sama. Pastikan Anda telah menautkan database dengan benar (karena Anda mungkin telah menyalin kode langsung dari beberapa contoh).
Cukup perbarui nama database dalam metode managedObjectModel dan persistentStoreCoordinator di AppDelegate.


1

Saya memiliki masalah yang sama, yaitu

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];

mengembalikan nihil, karena tidak ada file .momd yang dibuat.

Alasannya adalah karena dalam direktori aplikasi (mis. MyGreatApp / MyGreatApp.app) xcode telah menyalin MyModel.xcdatamodeld alih-alih membuat MyModel.momd dari file MyModel.xcdatamodeld (menggunakan momc).

Solusinya adalah menghapus referensi ke MyModel.xcdatamodeld di dalam browser proyek XCode dan menyeretnya kembali ke dalam proyek dari pencari. Setelah itu xcode menyadari perlu mengkompilasinya menjadi .momd.


1

Saya mengalami masalah ini entah dari mana setelah saya menghapus aplikasi yang dibuat di ~/Library/Application Support/iPhone Simulator. Entah bagaimana, hal ini menyebabkan build berikutnya gagal di simulator dan di perangkat. Tidak mengubah apa pun yang berkaitan dengan CoreData selama berabad-abad tetapi akan gagal dengan Cannot create an NSPersistentStoreCoordinator with a nil model. Mencoba beberapa hal di atas dan tidak ada yang berhasil.

Saya bisa melihat folder momd yang dihasilkan dengan file mom di dalamnya. Aplikasi di simulator dapat melihat keduanya tetapi gagal menghasilkan file sqlite.

Yang memecahkannya adalah menambahkan atribut ke entitas di file xcdatamodeld saya di Xcode dan kemudian segera menghapusnya. Saya berharap ini akan membuat Xcode meregenerasi apa pun yang menyebabkan masalah dari awal dan sepertinya berhasil. Masih belum jelas apa yang sebenarnya salah, tetapi aplikasi saya berjalan di simulator dan perangkat lagi sekarang.


0

Saya baru saja mengalami masalah serupa saat memutakhirkan dari IOS5 ke IOS6. Ternyata itu adalah masalah case sensitive dengan nama model.

Tidak yakin apakah ini membantu siapa pun.



0

Oke, saya akan memberi tahu setengah solusi dulu, ini akan berfungsi jika Anda menginstal ulang aplikasi (di perangkat simulator atau debugger). Tapi itu bukan solusi yang pasti. Misalnya, jika Anda mengupdate aplikasi, JANGAN lakukan itu atau versi baru Anda mungkin error karena pengguna tidak akan menginstalnya kembali, mereka akan menggunakan tombol update.

Seperti yang saya pahami, masalah ini sebagian besar terjadi saat Anda mengubah nama file model data. Alasannya mungkin seperti ini:
. Saat Anda menjalankan aplikasi untuk pertama kali, itu membuat file model data di app bundle seperti "data_model_1". Penciptaan ini hanya terjadi untuk pertama kalinya.
. Saat Anda memperbarui nama file dan menjalankan aplikasi lagi, aplikasi tidak akan dapat menemukannya karena masih ada file "data_model_1" tetapi Anda menyuruhnya untuk mencari "data_model_2". Bagaimana bisa ditemukan, itu belum membuatnya dan tidak akan melakukannya kecuali Anda tidak menginstal aplikasi dengan nama file baru.

Jadi, jika ini adalah versi pertama aplikasi Anda dan menginstal ulang pada simulator atau perangkat tidak membahayakan proyek Anda, lakukanlah. Jika tidak, periksa Panduan Pembuatan Versi dan Migrasi Data Inti di iOS Developer Library, mungkin itu yang Anda butuhkan.

Edit: Jika penginstalan ulang tidak berhasil, coba uninstal terlebih dahulu, lalu bersihkan project, lalu tutup semuanya, buka kembali project, dan build + run. Seharusnya itu berhasil.


0

Jika proyek Anda bekerja pada simulator tetapi tidak pada perangkat, coba jalankan rilis-build pada perangkat Anda, bukan pada debug-build.

Pilih proyek Anda -> Produk -> Edit Skema -> Konfigurasi Bangun [DEBUG -> RELEASE]

Sekarang jalankan proyek lagi, itu akan berhasil.


0

Saya juga menghadapi masalah ini tetapi ketika saya mengubah ModelName.xcdatamodeldfile itu berfungsi. jadi saya pikir ModelName.xcdatamodeld file tidak ditambahkan dengan benar, jadi periksa dan bersihkan aplikasi dan jalankan.


0

Setelah saya memperbaiki masalah penamaan, kesalahan tetap ada. Kemudian berfungsi setelah Xcode dimulai ulang 5. Ini mungkin secara otomatis melakukan hal yang sama seperti beberapa saran penautan manual yang ditawarkan di sini.


0

Bagi saya, masalahnya adalah karena saya menyalin model saya dari proyek kotak pasir ke proyek saya yang sebenarnya. Selalu pastikan untuk membuat model Anda dari dalam proyek yang model tersebut digunakan.


0

Saya menghadapi kesalahan yang sama ketika saya berganti nama dengan .xcdatamodelfile dari Xcode dan mengubah nama yang diganti nama di app delegasi di mana pun diperlukan, tetapi saya masih punya kesalahan yang sama. Tak satu pun dari prosedur yang disarankan berhasil untuk saya.

Kemudian saya membuka folder tersebut Finderdan menemukan file tambahan .xccurrentversionbersama dengan .xcdatamodelfile. Saya membukanya di TextEditaplikasi dan mengubah ini:

<dict>
    <key>_XCCurrentVersionName</key>
    <string>Your_Renamed_Model_FileName.xcdatamodel</string>
</dict>

Saya menggunakan ini dengan Xcode 6.4, OSX Yosemite 10.10.1

Saya harap ini membantu!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.