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




ios core-data (23)

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

Answers

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

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

Editor->Add Model Version...

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

هذا يعمل في Xcode 5


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

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


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

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


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

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

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


كان لي نفس المشكلة ، أنها عملت بشكل جيد على 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 )


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

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


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


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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

جاز.


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


لقد واجهت هذا الخطأ نفسه عندما .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

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


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

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

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

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


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

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


لقد كنت أبحث عن إجابة لساعات ولم ينجح شيء. ولكن بعد ذلك وجدت فجأة هذا 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;

وعمل كل شيء.


لقد واجهت مشكلة غريبة مع 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 تولد رمزًا لا يعمل مع نفسه ...


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

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

 NSString *[email protected]"ModelName";

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

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

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

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.


تحقق أولاً:

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

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

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

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


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

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

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

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


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

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

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


func tabGesture_Call
{
     let tapRec = UITapGestureRecognizer(target: self, action: "handleTap:")
     tapRec.delegate = self
     self.view.addGestureRecognizer(tapRec)
     //where we want to gesture like: view, label etc
}

func handleTap(sender: UITapGestureRecognizer) 
{
     NSLog("Touch..");
     //handling code
}




objective-c ios core-data