objective-c - لا يمكن إنشاء NSPersistentStoreCoordinator بنموذج nil




14 Answers

كان لي بالضبط نفس رسالة الخطأ كما في المشاركة الأصلية. كنت أتصارع مع هذا لساعات. كان هذا الخط في AppDelegate.m.

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

لأي شخص هناك البحث في رسالة الخطأ هذه والعثور على هذا الموضوع .... حاول هذا أولا.

يجب عليك التأكد من أنه حيث يقول [نفسه مع اسم xcdatamodeld] .... ذلك !!! لسبب ما ، كان لي اسم مشروعي هناك وليس اسم نموذج البيانات.

غيرت ذلك وعملت على الفور .....

شكرا لصخرة & مولر للمساهمة ....... لقد أنقذوني أيام !!

جاز.

تم إجراء أول تصدع في Core Data ، وأحصل على الخطأ التالي عند تشغيل الكود على جهازي ، ولكنه يعمل جيدًا على جهاز محاكاة ..

* إنهاء التطبيق بسبب عدم وجود استثناء "NSInvalidArgumentException" غير المعلوم ، السبب: "لا يمكن إنشاء NSPersistentStoreCoordinator بنموذج لاشيء"

بعض أساليبي التي قد تسبب المشكلة:

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

تصحيح

لقد قمت بنسخ ولصق طريقة managedObjectContext (أدناه) من CoreDataBooks من Apple وهي تعمل الآن .. ليس من المؤكد حقا لماذا

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



لقد واجهت مشكلة غريبة مع Xcode 4.3.2 و iOS 5.

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

بإرجاع عنوان URL صالح ولكن

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

تقوم بإرجاع NAMManagedObjectModel فارغة. ولكن بعد التحقق من documentation ، يبدو أن NSManagedObjectModel يحتاج إلى ملف حيث أن NAME_OF_THE_MODEL.momd هو دليل يحتوي على ملف NAME_OF_THE_MODEL.mom. تغيير عنوان URL لـ

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

ثم يعمل. يبدو غريبًا أن Xcode تولد رمزًا لا يعمل مع نفسه ...




مصدر آخر لهذا الخطأ ، هو أنه في بعض الأحيان لا يتضمن Xcode نموذج البيانات في البنية.

تحقق من "إنشاء مراحل" الهدف الخاص بك وتأكد من تضمين الملف * .xcdatamodeld في المقطع Compilation Sources.




حصلت على نفس المشكلة معDominic وليامز

حاول تغيير اسم ملف momd في أدناه (يمكنك العثور على هذا في طريقة managedObjectModel في managedObjectModel الافتراضي) ، وهو نفس [file name].xcdatamodeld الذي قمت بإنشائه:

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



كان لي نفس المشكلة. كان الحل مزيجًا من إجابتين:

1) اضطررت لإضافة معلمة "دليل فرعي" إلى استدعاء URLForResource

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

2) لسبب لا أعرف ، لم يتم تضمين نموذج البيانات عندما تم تجميع المشروع. واضطررت إلى إضافته يدويًا إلى "Build Phases / Compile resources".

مع واحد فقط من الحلول المذكورة أعلاه ، لم يعمل التطبيق الخاص بي.




لقد جربت كل الحلول هنا ولم يعمل أي منها. ظهرت مشكلتي بعد أن أعدت تسمية المشروع. على ما يبدو ، تواصل Xcode للبحث عن ملف momd القديم في المكان الخطأ أثناء التحويل البرمجي.

لأي شخص حاول كل الحلول المذكورة أعلاه دون نجاح ، حاول التحقق من المسار الكامل لملف .xcdatamodeld الخاص بك. هذا ما كان يعمل بالنسبة لي.




أنا حل المشكلة دون تغيير أي رمز.

أقوم بإضافة ModelName.xcdatamodeld خلال File-> Add File بدلاً من سحب الملف إلى Xcode.

 NSString *[email protected]"ModelName";

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

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



لقد كنت أبحث عن إجابة لساعات ولم ينجح شيء. ولكن بعد ذلك وجدت فجأة هذا article . وبناءً على ذلك ، كانت المشكلة في وضع وحدة تحكم الجذر في هذا الجزء من AppDelegate.m:

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

في الواقع ، يجب تحديد وحدة تحكم الجذر التي تقوم بتفويض اتصال CoreData الخاص بك. وفي حالتي كان لدي TabBarController متصلاً بمناظر أخرى ، لذلك تم تعريف وحدة تحكم الجذر في العرض المتدرج على أنها TabBar وتسببت في حدوث خطأ. لقد تغيرت

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

إلى

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

وعمل كل شيء.




إذا كان هناك شخص ما عالقًا بسبب نفس المشكلة. تأكد من أنك قمت بربط قاعدة البيانات بشكل صحيح (لأنك قد قمت بنسخ الكود مباشرة من بعض الأمثلة).
فقط قم بتحديث اسم قاعدة البيانات في manageObjectModel والأساليب persistentStoreCoordinator في AppDelegate.




لقد واجهت هذه المشكلة من أي مكان بعد أن حذفت التطبيق الذي تم إنشاؤه في ~/Library/Application Support/iPhone Simulator . على نحو ما تسبب ذلك في فشل التركيبات اللاحقة في جهاز المحاكاة وعلى الأجهزة. لم يتم تغيير أي شيء للقيام به مع CoreData للأعمار ولكنه سيفشل مع Cannot create an NSPersistentStoreCoordinator with a nil model . حاول بعض الأشياء المذكورة أعلاه ولا شيء يعمل.

تمكنت من رؤية المجلد momd الذي تم إنشاؤه باستخدام ملف mom بالداخل. يمكن أن يشاهد التطبيق في جهاز محاكاة كلاهما ولكنه فشل في إنشاء ملف sqlite.

ما تم حلها كان إضافة سمة إلى كيان في ملف xcdatamodeld الخاص بي في Xcode ثم حذفه على الفور. كنت آمل أن يحصل هذا على إكسكودي لتجديد كل ما كان يسبب المشكلة من الصفر ويبدو أن العمل. لا يزال غير واضح ما هو الخطأ في الواقع ، ولكن يتم تشغيل التطبيق الخاص بي في جهاز محاكاة والأجهزة مرة أخرى الآن.







إذا كان مشروعك يعمل على جهاز المحاكاة ولكن ليس على الجهاز ، فجرِّب تشغيل الإصدار على جهازك بدلاً من بناء التصحيح.

حدد مشروعك -> المنتج -> مخطط التعديل -> تكوين البناء [التصحيح -> الإصدار]

الآن قم بتشغيل المشروع مرة أخرى ، ستعمل.




بعد أن أصلحت مشكلة التسمية ، بقي الخطأ. ثم عملت بعد إعادة تشغيل Xcode 5. قد يقوم هذا تلقائيًا بنفس الشيء مثل بعض اقتراحات الربط اليدوية المعروضة هنا.




لقد واجهت هذا الخطأ نفسه عندما .xcdatamodel بإعادة تسمية ملف .xcdatamodel من xcode وغيرت الاسم الذي أعيدت تسميته في تفويض التطبيق حيثما كان مطلوبًا ، ولكني ما زلت .xcdatamodel نفس الخطأ. لم ينجح أي من الإجراء المقترح بالنسبة لي.

ثم فتحت المجلد في Finder والعثور على ملف إضافي. .xccurrentversion مع ملف .xcdatamodel . فتحته في تطبيق TextEdit وغيرت هذا:

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

أنا أستخدم هذا مع Xcode 6.4، OSX Yosemite 10.10.1

اتمني ان يكون مفيدا!




Related

objective-c ios core-data