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



Answers

تحقق أولاً:

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

إذا كنت تحصل على قيمة لا شيء ربما تكون المشكلة هنا

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

لذا ، جرِّب تغيير @ "momd" بواسطة @ "mom"

Question

تم إجراء أول تصدع في 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;
}



كان لي نفس المشكلة ، أي

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

عاد لا شيء ، لأنه لم يكن هناك ملف .momd ولدت.

كان السبب في أنه في دليل التطبيق (على سبيل المثال MyGreatApp / MyGreatApp.app) كان xcode نسخ MyModel.xcdatamodeld بدلاً من إنشاء MyModel.momd من ملف MyModel.xcdatamodeld (باستخدام momc).

كان الحل هو حذف المرجع إلى MyModel.xcdatamodeld داخل متصفح مشروع XCode وسحبه مرة أخرى إلى المشروع من الباحث. بعد أن أدركت xcode أنها بحاجة إلى تجميعها إلى .momd.




أنا أيضا تواجه هذه المشكلة ولكن عندما أقوم بتغيير الملف ModelName.xcdatamodeld تعمل. لذلك أعتقد أن الملف ModelName.xcdatamodeld لا تضاف إلى بشكل صحيح ، لذلك مرة واحدة تحقق وتنظيف التطبيق وتشغيله.




أنا حلها عن طريق إضافة ملف ديسيبل إلى Copy Bundle Resources .

اذهب إلى الجذر الخاص بمشروعك >> اختر هدفك >> إنشاء المراحل >> نسخ حزمة الموارد. تأكد من إضافة ملف xcdatamodeld الخاص بك هنا.

لم ينجح أي من الحلول المنشورة. لذا ، نأمل أن تساعد هذه المشاركة شخصًا ما هناك. تعطل تطبيقي فقط في إصدار الإصدارات btw. الدرس المستفاد. دائما إصدار اختبار يبني!

راجع للشغل ، لقد وجدت هذا SO آخر الأكثر فائدة https://.com/a/6708837/951349 .




بالنسبة لي ، كانت المشكلة بسبب نسخ نسخ النموذج من مشروع sandbox إلى مشروعي الفعلي. تأكد دائمًا من إنشاء نموذجك من داخل المشروع لاستخدام النموذج.




أعلم أن هذا لا يحل مشكلتك ولكني واجهت هذه المشكلة بالأمس والتي ابتليت بها لساعات ، فإن الحلDominic Williams posted أعطاني ArrayIndexOutOfBoundsException (أيا كان الهدف C مكافئ).

أنا لست جيدًا جدًا مع Objective-C / Xcode حتى الآن ولكنني أعمل على تطبيق iOS الذي طورته شركتنا (في الغالب) خارجيًا. لسوء الحظ ، فإنهم غالبا ما ينسون كيفية استخدام لوحة المفاتيح ويستخدمون الأحرف الكبيرة بشكل متبادل أو الخصائص الإملائية بشكل غير صحيح ، لكنهم كسالى جدا للرجوع إليها وتغييرها. لقد استخدموا حرفًا كبيرًا في اسم مشروع xcode حيث لم يكن من المفترض أن يكون (اسم منتجنا لا يستخدم رأس مال) وكان علي أن أعود وأغير كل ظهور لهذه الرسالة الكبيرة إلى حالة صغيرة . والتي تضمنت اسم المشروع ، ملف البيانات الأساسي ، مئات المتغيرات ، إلخ.

على أي حال ، بمجرد أن فعلت هذا واجهت هذا الخطأ ولم يكن هناك حل حلها بالنسبة لي. لقد تأكدت من صحة جميع عناوين URL ، أو تنظيف المشروع ، أو إلغاء تثبيت التطبيق ، أو إعادة تشغيل الهاتف ، وغير ذلك دون جدوى. استسلمت وأطفأت جهاز Mac الخاص بي وذهبت إلى المنزل طوال اليوم. لدهشتي ، لقد عدت في هذا الصباح ويبدو أن كل شيء يعمل بشكل جيد!

ليس لدي أي فكرة عن سبب نجاح ذلك ، ولكن إذا واجهت مشكلة ، فحاول إعادة تشغيل جهاز Mac.




ما حدث على الأرجح هو أن ملف xcdatamodeld الخاص بك من كود مصدر Apple قد تحول إلى ملف xcdatamodel (بدون d) وبالتالي لا يعتبر نفسه.

إن أسرع طريقة لإصلاح هذا هو تحديد ملف xcdatamodel في متصفح المشروع وفي شريط القوائم

Editor->Add Model Version...

وإضافة إصدار جديد من نموذجك. قم بإجراء جميع التغييرات على الإصدار الجديد.

هذا يعمل في Xcode 5




حسنًا ، سأخبر بنصف حل أولاً ، سيعمل إذا أعدت تثبيت التطبيق (في جهاز محاكاة أو جهاز مصحح الأخطاء). لكن هذا ليس حلا حقيقيا بالتأكيد. على سبيل المثال ، إذا كنت تقوم بتحديث التطبيق الخاص بك ، فلا تفعل ذلك أو قد يتعطل الإصدار الجديد لأن المستخدمين لن يقوموا بإعادة تثبيته ، بل سيستخدمون زر التحديث بدلاً من ذلك.

كما فهمت ، تحدث هذه المشكلة في الغالب عند تغيير اسم ملف نموذج البيانات. قد يكون السبب كالتالي:
. عند تشغيل التطبيق لأول مرة ، يتم إنشاء ملف نموذج بيانات في حزمة التطبيق مثل "data_model_1". يحدث هذا الإنشاء لأول مرة فقط.
. عند تحديث اسم الملف وتشغيله مرة أخرى ، لن يتمكن من العثور عليه نظرًا لوجود ملف "data_model_1" ، ولكنك ستخبره بالبحث عن "data_model_2". كيف يمكن العثور عليها ، لم تقم بإنشائها بعد ولن تقوم بتثبيت التطبيق باسم ملف جديد.

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

تعديل: إذا لم تنجح عملية إعادة التثبيت ، فحاول إلغاء التثبيت أولاً ، ثم تنظيف المشروع ، ثم إغلاق كل شيء ، وإعادة فتح المشروع ، وإنشاء +. التي يجب أن تعمل.




الحل للمشكلة التي تتحدث عنها بسيط. غيّر امتداد الملف إلى "mom" بدلاً من "momd" في عنوان URL للنموذج. فعله.




كان لدي هذه المشكلة وتغيير "الأمهات" إلى "أمي" لم يفعل أي شيء. لإصلاحه واضطررت إلى النقر بزر الماوس الأيمن على ملف xcdatamodelId> إظهار محتويات الحزمة ثم حذف ملف .xcurrentversion المخفية.

ملاحظة: بدأت هذه المشكلة فقط بعد أن قمت بتغيير اسم ملف نموذج البيانات.




كان لي نفس المشكلة ، أنها عملت بشكل جيد على iOS6 ولكن ليس على iOS5. هذه هي الطريقة التي قمت بحلها:

  1. إنشاء نسخة طراز جديد في xcode. (حدد .xcdatamodeld ، افتح قائمة محرر وانقر فوق "إضافة إصدار نموذج ...")
  2. ترجمة وتأكد من أن الإصدار الجديد يعمل.
  3. تعيين القديم كإصدار الحالي. ("الحالي" في ملف المفتش لل. .xcdatamodeld تحت نموذج البيانات الأساسية Versioned)
  4. قم بإزالة المرجع إلى ملف. .xcdatamodeld في xcode
  5. انقر بزر الماوس الأيمن فوق ملف .xcdatamodeld في Finder واختر "Show Package Contents"
  6. حذف .xcdatamodel الجديد الذي لا تريده
  7. أعد إضافة. .xcdatamodeld في xcode
  8. ترجمة وابتسامة

(هذا هو المكان الذي وجدت فيه كيفية حذف إصدار الطراز: كيفية حذف إصدار طراز قديم / غير مستخدم في Xcode )




لقد واجهت مشكلة مشابهة في الترقية من IOS5 إلى IOS6. تبين أنها كانت قضية حساسة لحالة اسم النموذج.

لست متأكدا مما إذا كان هذا يساعد أي شخص.




من جانبي كانت المشكلة أنني قمت بتغيير حالة زوج من الأحرف في اسم قاعدة البيانات.

عند بدء مشروع جديد ، يقوم Xcode تلقائيًا بتعيين كل شيء من اسم المشروع. إذا بدأت في الاتصال بمشروعك "Rugbyontv" وقررت في وقت لاحق أن تتحول إلى "RugbyOnTV" وقمت بعملية بحث واستبدال ، فهذا من شأنه أن يكسرها. (Credit to Rob للإشارة إلى أن الاسم حساس لحالة الأحرف)




Related