ไม่สามารถสร้าง NSPersistentStoreCoordinator ด้วยโมเดลศูนย์


96

เคยแคร็กครั้งแรกที่ 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;
    }

แก้ไข

ฉันคัดลอกและวางเมธอดagedObjectContext (ด้านล่าง) จาก CoreDataBooks ของ Apple และตอนนี้ใช้งานได้แล้ว .. ไม่แน่ใจจริงๆว่าทำไม

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

เฮ้มันอาจจะง่ายพอ ๆ กับการต่อท้ายคำว่า "Model" กับพารามิเตอร์ URLForResource แรก .... ใช่ฉันมีปัญหาเดียวกัน จากนั้นฉันตรวจสอบเนื้อหา. app จริงในบรรทัดคำสั่งและพบว่ามีการสร้าง. momd ขึ้นจริง ลองทำตามนี้: [[NSBundle mainBundle] URLForResource: @ "RugbyOnTvModel" withExtension: @ "momd"];
PostCodeism

NSString *basePath = [paths firstObject];
William Entriken

คำตอบ:


157

ฉันมีข้อความแสดงข้อผิดพลาดเหมือนกับโพสต์เดิมทุกประการ ฉันต่อสู้กับสิ่งนี้เป็นเวลาหลายชั่วโมง มันเป็นบรรทัดนี้ใน AppDelegate.m ของฉัน

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

สำหรับใครก็ตามที่ค้นหาข้อความแสดงข้อผิดพลาดนี้และพบหัวข้อนี้ .... ลองทำก่อน

คุณต้องตรวจสอบให้แน่ใจว่ามันระบุว่า [เหมือนกับชื่อ xcdatamodeld] .... นั่นคือที่ไหน !!! ด้วยเหตุผลบางประการของฉันมีชื่อโปรเจ็กต์ของฉันอยู่ในนั้นไม่ใช่ชื่อโมเดลข้อมูล

เปลี่ยนแล้วมันใช้ได้ทันที .....

ขอบคุณ Rock & Muller ที่ร่วมให้ข้อมูล ....... คุณช่วยฉันได้หลายวัน !!

กัซ


2
นี่คือความคิดเห็นที่ทำให้ฉันได้ผล ชื่อที่มีมนต์ขลัง app ของฉันกำลังมองหาเป็นจากblah blah.xcdatamodeldขอบคุณอินเทอร์เน็ตและ stackoverflow
acedanger

ฉันมี "Model.xcdatamodeld" เปลี่ยนเป็น "Model" เป็นอาร์กิวเมนต์ แต่ Xcode ปฏิเสธที่จะโหลด แต่ไฟล์นี้มีอยู่จริง! ฉันไม่รู้ว่าเกิดอะไรขึ้น
Darmen Amanbayev

ว้าว. ขอบคุณที่กระแทกหัวฉันมาสักพักแล้ว
Sani Elfishawy

แล้ว storeURL ล่ะ?
MoralCode

54

ตรวจสอบครั้งแรก:

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

หากคุณได้ค่าศูนย์ปัญหาอาจอยู่ที่นี่

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

งั้นลองเปลี่ยน @ "momd" โดย @ "mom"


1
คุณถูก. มันเป็นโมฆะดังนั้นบรรทัดนี้ทำให้เกิดข้อผิดพลาด: __persistentStoreCoordinator = [[NSPersistentStoreCoordinator จัดสรร] initWithManagedObjectModel: [self managedObjectModel]]; ดูเหมือนว่าการเปลี่ยนเป็นแม่จะไม่สามารถแก้ไขอะไรได้เลย
Dominic Williams

3
เป็นไปได้มากที่สุดmodelURLเช่นnilกัน RugbyOnTvสาเหตุที่พบบ่อยที่สุดคือการพิมพ์ผิดใน โปรดทราบว่ากรณีนี้คำนึงถึงตัวพิมพ์เล็กและใหญ่
Rob Napier

1
การเปลี่ยน "momd" เป็น "mom" ก็ใช้ได้ผลกับฉันเช่นกัน ขอบคุณ. แต่ .. ทำไม? เหตุใด XCode จึงสร้างโค้ดที่ไม่ทำงาน เหตุใดฉันจึงพบการแก้ไขที่คลุมเครือเช่นนี้ใน SO เพื่อให้เทมเพลตพื้นฐานทำงานได้
Rhubarb

10
เมื่อไม่นานมานี้ได้เปิดตัวรุ่นที่ 2 ของโมเดลของฉันฉันต้องเปลี่ยนกลับเป็นรุ่นแม่ เนื่องจากคอนเทนเนอร์เวอร์ชันโมเดลมีส่วนขยายของ xdatamodeld ฉันคิดว่าเราสามารถสรุปได้ว่าเกิดอะไรขึ้นที่นี่ "momd" ใช้สำหรับรุ่นที่มีมากกว่าหนึ่งเวอร์ชันในขณะที่ "mom" ใช้สำหรับรุ่นที่ไม่มีการกำหนดเวอร์ชัน
Gerald

2
ฉันคัดลอกโค้ดไปยังโปรเจ็กต์ใหม่ [iOS7] แบบคำต่อคำและเดิมทีเป็นแบบแม่ แต่เปลี่ยนให้แม่แก้ไข ฉันไม่รู้ว่าฉันจะหาทางออกได้อย่างไรหากไม่มีสิ่งนี้ขอบคุณ :)
Ian Clay

20

ฉันพบปัญหาแปลก ๆ กับ Xcode 4.3.2 และ iOS 5

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

ส่งคืน URL ที่ถูกต้อง แต่

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

ส่งคืนค่าว่าง NSManagedObjectModel แต่หลังจากตรวจสอบเอกสารแล้วดูเหมือนว่า 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 จะสร้างรหัสที่ใช้ไม่ได้กับตัวมันเอง ...


1
ปัญหาเฉพาะนี้เกิดจากการสร้างรุ่นเพิ่มเติมจากนั้นพยายามลบด้วยตนเองในขณะที่ Xcode เปิดอยู่ สิ่งนี้ทำให้เกิดการทุจริตบางประเภท คุณไม่ควรส่งต่อในรุ่นเฉพาะรุ่นในไดเร็กทอรี momd
Mike Weller

เจ๋ง @MikeWeller น่ารู้. คุณรู้หรือไม่ว่าข้อมูลเมตาที่ชี้ไปที่ไฟล์ mom ในไดเร็กทอรี momd อยู่ที่ไหน
xster

ฉันไม่ได้พยายามลบมัน แต่ฉันมีปัญหานี้และวิธีแก้ปัญหาที่โพสต์ใช้ได้สำหรับฉันโดยเฉพาะฉันเพิ่งเพิ่มการตรวจสอบเพื่อดูว่ามันยังคงเป็นศูนย์หรือไม่และฉันเพิ่มรหัสนั้นด้านบนหรือไม่: if (_managedObjectContext == ศูนย์) {NSURL * modelURL = [[NSBundle mainBundle] URLForResource: @ "Model" withExtension: @ "mom" subdirectory: @ "Model.momd"]; _managedObjectModel = [[NSManagedObjectModel จัดสรร] initWithContentsOfURL: modelURL]; }
David van Dugteren

19

ฉันมีปัญหานี้และการเปลี่ยน "แม่" เป็น "แม่" ไม่ได้ทำอะไรเลย ในการแก้ไขฉันต้องคลิกขวาที่ไฟล์ xcdatamodelId> แสดงเนื้อหาแพ็คเกจจากนั้นลบไฟล์. xcurrentversion ที่ซ่อนอยู่

ปล: ปัญหานี้เริ่มเกิดขึ้นหลังจากที่ฉันเปลี่ยนชื่อไฟล์โมเดลข้อมูลเท่านั้น


2
สำหรับทุกคนที่พบปัญหาต่อไปนี้ :agedObjectModel เป็นศูนย์หลังจากเปลี่ยนชื่อไฟล์ xcdatamodeld: คำตอบนี้ดีที่สุด! ขอบคุณ JDx คำตอบของคุณช่วยฉันได้มาก!
Dumoko

แทนที่จะลบทิ้งคุณสามารถแก้ไขได้ในที่สุดเพื่อเปลี่ยนชื่อไฟล์ที่เก็บไว้เป็นเวอร์ชันล่าสุดของ youl xcdatamodel
furins

13

อีกแหล่งหนึ่งของข้อผิดพลาดนี้คือบางครั้ง Xcode ไม่รวมโมเดลข้อมูลในบิลด์

ตรวจสอบขั้นตอนการสร้างของเป้าหมายของคุณและตรวจสอบให้แน่ใจว่าไฟล์ * .xcdatamodeld รวมอยู่ในส่วน Compile Sources


สิ่งนี้แก้ไขให้ฉัน
Ben Thomas

สิ่งนี้ได้ผลสำหรับฉัน มันน่าผิดหวังและยากที่จะแก้ไขข้อบกพร่องเมื่อทำงานบน Simulator และไม่ได้อยู่บนอุปกรณ์จริง!
Bishal Ghimire

9

สิ่งที่อาจเกิดขึ้นคือไฟล์ xcdatamodeld ของคุณจากซอร์สโค้ดของ Apple ได้กลายเป็นไฟล์ xcdatamodel (ไม่มี d) ดังนั้นจึงไม่ถือว่าเป็นไฟล์เดียวกัน

วิธีที่เร็วที่สุดในการแก้ไขปัญหานี้คือการเลือกไฟล์ xcdatamodel ในตัวนำทางโปรเจ็กต์ของคุณและในแถบเมนู

Editor->Add Model Version...

และเพิ่มรุ่นใหม่ของแบบจำลองของคุณ ทำการเปลี่ยนแปลงทั้งหมดเป็นเวอร์ชันใหม่

ใช้งานได้ใน Xcode 5


ขออภัยไม่มีตัวเลือกนี้ใน Xcode 5 .. ดูที่นี่
abbood

ลืมบอกไปว่าต้องเลือกไฟล์ xcdatamodel แก้ไขคำตอบเพื่อแสดงความคิดเห็น
Louis Cremen

8

ฉันแก้ปัญหาโดยการเพิ่มไฟล์ db ลงในไฟล์Copy Bundle Resources.

ไปที่รูทของโปรเจ็กต์ของคุณ >> เลือกเป้าหมายของคุณ >> สร้างเฟส >> คัดลอกทรัพยากรบันเดิล ตรวจสอบให้แน่ใจว่าได้เพิ่มไฟล์ xcdatamodeld ที่นี่แล้ว

ป้อนคำอธิบายภาพที่นี่

ไม่มีวิธีแก้ปัญหาที่โพสต์ไว้สำหรับฉัน ดังนั้นหวังว่าโพสต์นี้จะช่วยใครบางคนได้ แอพของฉันขัดข้องเฉพาะในรุ่นที่สร้าง btw บทเรียน. รุ่นทดสอบเสมอ!

BTW ฉันพบนี้เพื่อโพสต์เป็นประโยชน์มากที่สุดhttps://stackoverflow.com/a/6708837/951349


6

ฉันมีปัญหาเดียวกันกับ @Dominic Williams

ลองเปลี่ยนชื่อไฟล์ momd ด้านล่าง (คุณสามารถค้นหาสิ่งนี้ได้ในmanagedObjectModelวิธีการเริ่มต้น) ซึ่งเหมือนกับ[file name].xcdatamodeldไฟล์ที่คุณสร้าง:

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

5

ผมมีปัญหาเหมือนกัน. คำตอบคือการผสมผสานของ 2 คำตอบ:

1) ฉันต้องเพิ่มพารามิเตอร์ "ไดเรกทอรีย่อย" ในการเรียก URLForResource

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

2) ด้วยเหตุผลที่ฉันไม่ทราบจึงไม่รวมโมเดลข้อมูลเมื่อมีการรวบรวมโครงการ ฉันต้องเพิ่มมันลงใน "สร้างเฟส / คอมไพล์ทรัพยากร" ด้วยตนเอง

ด้วยวิธีแก้ปัญหาข้างต้นเพียงวิธีเดียวแอปพลิเคชันของฉันไม่ทำงาน


4

วิธีแก้ปัญหาที่คุณพูดถึงนั้นง่ายมาก เปลี่ยนนามสกุลไฟล์เป็น "mom" แทน "momd" ใน URL ของโมเดล เสร็จแล้ว


4

ฉันลองใช้วิธีแก้ปัญหาทั้งหมดที่นี่แล้วและไม่มีวิธีใดได้ผล ปัญหาของฉันปรากฏขึ้นหลังจากที่ฉันเปลี่ยนชื่อโครงการ เห็นได้ชัดว่า Xcode ยังคงมองหาไฟล์ momd เก่าในตำแหน่งที่ไม่ถูกต้องในระหว่างการรวบรวม

สำหรับใครก็ตามที่ลองวิธีแก้ปัญหาข้างต้นทั้งหมดแล้วไม่ประสบความสำเร็จให้ลองตรวจสอบเส้นทางทั้งหมดของ.xcdatamodeldไฟล์ นั่นคือสิ่งที่ได้ผลสำหรับฉัน


4

ฉันมีปัญหาเดียวกันมันทำงานได้ดีบน iOS6 แต่ไม่ใช่บน iOS5 นี่คือวิธีที่ฉันแก้ไข:

  1. สร้าง Model version ใหม่ใน xcode (เลือก.xcdatamodeldเปิดเมนูตัวแก้ไขและคลิก "เพิ่มรุ่นรุ่น ... ")
  2. รวบรวมและตรวจสอบให้แน่ใจว่าเวอร์ชันใหม่ใช้งานได้
  3. ตั้งค่าเก่าเป็นเวอร์ชันปัจจุบัน ("ปัจจุบัน" ในตัวตรวจสอบไฟล์สำหรับ.xcdatamodeldโมเดลข้อมูลหลักที่อยู่ภายใต้เวอร์ชัน)
  4. ลบการอ้างอิง.xcdatamodeldไฟล์ใน xcode
  5. คลิกขวาที่.xcdatamodeldไฟล์ใน Finder แล้วเลือก "Show Package Contents"
  6. ลบสิ่งใหม่.xcdatamodelที่คุณไม่ต้องการ
  7. เพิ่ม.xcdatamodeldใน xcode อีกครั้ง
  8. รวบรวมและยิ้ม

(นี่คือที่ที่ฉันพบวิธีการลบ Model version: วิธีลบ Data Model Version เก่า / ที่ไม่ได้ใช้ใน Xcode )


แทคså mycket! สิ่งนี้มีประโยชน์มาก
Michael Dorner

4

ฉันแก้ปัญหาโดยไม่ต้องเปลี่ยนรหัสใด ๆ

ฉันเพิ่ม ModelName.xcdatamodeld ผ่าน File-> Add File แทนการลากไฟล์ลงใน Xcode

 NSString *path=@"ModelName";

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

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

1

ในด้านของฉันปัญหาคือฉันเปลี่ยนกรณีของอักขระสองสามตัวในชื่อฐานข้อมูล

เมื่อเริ่มโปรเจ็กต์ใหม่ Xcode จะตั้งค่าทุกอย่างจากชื่อโปรเจ็กต์โดยอัตโนมัติ หากคุณเริ่มเรียกโปรเจ็กต์ของคุณว่า "Rugbyontv" และต่อมาตัดสินใจเปลี่ยนเป็น "RugbyOnTV" และทำการค้นหาและแทนที่นั่นจะทำให้มันพัง (ให้เครดิตกับ Rob สำหรับการชี้ให้เห็นว่าชื่อเป็นตัวพิมพ์เล็กและใหญ่)


1

ฉันหาคำตอบมาหลายชั่วโมงแล้วและไม่มีอะไรได้ผล แต่แล้วผมก็คิดว่านี้เป็นบทความ ตามนี้ปัญหาคือในการตั้งค่าตัวควบคุมรูทในส่วนนี้ของ AppDelegate.m:

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

ในความเป็นจริงคุณควรกำหนดว่า root controller ใดที่จะมอบหมายการเชื่อมต่อ CoreData ของคุณ และในกรณีของฉันฉันมี TabBarController ที่เชื่อมต่อกับมุมมองอื่น ๆ ดังนั้นตัวควบคุมรูทมุมมอง targed ของฉันจึงถูกกำหนดเป็น TabBar และทำให้เกิดข้อผิดพลาด ฉันเปลี่ยนไป

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

ถึง

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

และทุกอย่างได้ผล


1

ฉันรู้ว่านี่ไม่สามารถแก้ปัญหาของคุณได้ แต่ฉันพบปัญหานี้เมื่อวานนี้ซึ่งรบกวนฉันเป็นเวลาหลายชั่วโมงวิธีแก้ปัญหาที่ @Dominic Williams โพสต์ให้ ArrayIndexOutOfBoundsException แก่ฉัน (สิ่งที่เทียบเท่า Objective-C)

ฉันยังไม่ค่อยดีกับ Objective-C / Xcode แต่ฉันกำลังทำงานกับแอป iOS ที่ บริษัท ของเรา (ส่วนใหญ่) พัฒนาจากภายนอก น่าเสียดายที่พวกเขามักจะลืมวิธีการใช้แป้นพิมพ์และจะใช้ตัวพิมพ์ใหญ่สลับกันหรือคุณสมบัติการสะกดไม่ถูกต้อง แต่ขี้เกียจกลับไปเปลี่ยน พวกเขาใช้อักษรตัวใหญ่ในชื่อโปรเจ็กต์ xcode ซึ่งไม่ควรจะเป็น (ชื่อผลิตภัณฑ์ของเราไม่ใช้ตัวพิมพ์ใหญ่) และฉันต้องกลับไปเปลี่ยนทุกครั้งที่เกิดขึ้นของตัวอักษรตัวพิมพ์ใหญ่นี้เป็นตัวพิมพ์เล็ก ; ซึ่งรวมถึงชื่อโครงการไฟล์ข้อมูลหลักตัวแปรหลายร้อยตัวเป็นต้น

อย่างไรก็ตามเมื่อฉันทำสิ่งนี้แล้วฉันก็พบข้อผิดพลาดนี้และไม่มีวิธีแก้ไขให้ฉัน ฉันตรวจสอบให้แน่ใจว่าชื่อ URL ทั้งหมดถูกต้องล้างโปรเจ็กต์ถอนการติดตั้งแอพรีสตาร์ทโทรศัพท์ ฯลฯ โดยไม่มีประโยชน์ ฉันยอมแพ้และปิด Mac ของฉันและกลับบ้านในวันนั้น ที่แปลกใจคือฉันกลับมาในเช้าวันนี้และทุกอย่างดูเหมือนจะดี!

ฉันไม่รู้ว่าทำไมถึงได้ผล แต่ถ้าคุณติดขัดให้ลองรีสตาร์ท Mac


1

ถ้ามีใครติดเพราะประเด็นเดียวกัน. ตรวจสอบให้แน่ใจว่าคุณได้เชื่อมโยงฐานข้อมูลอย่างถูกต้อง (เนื่องจากคุณอาจคัดลอกโค้ดจากตัวอย่างโดยตรง)
เพียงอัปเดตชื่อของฐานข้อมูลในเมธอดagedObjectModelและpersistentStoreCoordinatorใน AppDelegate


1

ฉันมีปัญหาเดียวกันคือ

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


1

ฉันไม่มีปัญหานี้เลยหลังจากที่ฉันลบแอพที่สร้างขึ้นในไฟล์~/Library/Application Support/iPhone Simulator. สิ่งนี้ทำให้การสร้างที่ตามมาล้มเหลวในตัวจำลองและบนอุปกรณ์ ไม่ได้เปลี่ยนแปลงอะไรที่เกี่ยวข้องกับ CoreData มานานแล้ว แต่มันจะล้มเหลวด้วยไฟล์Cannot create an NSPersistentStoreCoordinator with a nil model . ลองสองสามข้อข้างต้นแล้วไม่มีอะไรได้ผล

ฉันเห็นโฟลเดอร์ momd ที่สร้างขึ้นโดยมีไฟล์แม่อยู่ข้างใน แอปในเครื่องจำลองสามารถมองเห็นทั้งสองอย่าง แต่ไม่สามารถสร้างไฟล์ sqlite ได้

สิ่งที่แก้ไขได้คือการเพิ่มแอตทริบิวต์ให้กับเอนทิตีในไฟล์ xcdatamodeld ของฉันใน Xcode แล้วลบออกทันที ฉันหวังว่านี่จะทำให้ Xcode สามารถสร้างสิ่งที่เป็นสาเหตุของปัญหาได้ตั้งแต่เริ่มต้นและดูเหมือนว่าจะใช้งานได้ ยังไม่ชัดเจนว่ามีอะไรผิดปกติ แต่ตอนนี้แอปของฉันกำลังทำงานในโปรแกรมจำลองและอุปกรณ์อีกครั้ง


0

ฉันมีปัญหาคล้ายกันในการอัปเกรดจาก IOS5 เป็น IOS6 ปรากฎว่าเป็นปัญหาที่ละเอียดอ่อนกับชื่อรุ่น

ไม่แน่ใจว่าสิ่งนี้ช่วยใครได้บ้าง



0

เอาล่ะฉันจะบอกวิธีแก้ปัญหาครึ่งหนึ่งก่อนมันจะใช้งานได้ถ้าคุณติดตั้งแอปอีกครั้ง (ในอุปกรณ์จำลองหรืออุปกรณ์ดีบั๊ก) แต่นั่นไม่ใช่วิธีแก้ปัญหาที่แท้จริงอย่างแน่นอน ตัวอย่างเช่นหากคุณกำลังอัปเดตแอปพลิเคชันของคุณอย่าทำเช่นนั้นมิฉะนั้นเวอร์ชันใหม่ของคุณอาจขัดข้องเนื่องจากผู้ใช้จะไม่ติดตั้งใหม่พวกเขาจะใช้ปุ่มอัปเดตแทน

ตามที่ฉันเข้าใจปัญหานี้ส่วนใหญ่เกิดขึ้นเมื่อคุณเปลี่ยนชื่อไฟล์โมเดลข้อมูล สาเหตุอาจเป็นเช่นนี้:
. เมื่อคุณเรียกใช้แอปเป็นครั้งแรกแอปจะสร้างไฟล์โมเดลข้อมูลใน App Bundle เช่น "data_model_1" การสร้างนี้เกิดขึ้นเป็นครั้งแรกเท่านั้น
. เมื่อคุณอัปเดตชื่อไฟล์และเรียกใช้แอปอีกครั้งจะไม่สามารถค้นหาได้เนื่องจากยังมีไฟล์ "data_model_1" แต่คุณกำลังบอกให้มองหา "data_model_2" มันหาได้ยังไงมันยังไม่ได้สร้างและจะไม่ได้เว้นแต่คุณจะไม่ติดตั้งแอพด้วยชื่อไฟล์ใหม่

ดังนั้นหากนี่เป็นเวอร์ชันแรกของแอปของคุณและการติดตั้งใหม่ในโปรแกรมจำลองหรืออุปกรณ์ไม่เป็นอันตรายต่อโครงการของคุณให้ทำ มิฉะนั้นให้ตรวจสอบการกำหนดเวอร์ชันโมเดลข้อมูลหลักและคู่มือการย้ายข้อมูลบนไลบรารีนักพัฒนา iOS อาจเป็นสิ่งที่คุณต้องการ

แก้ไข: หากการติดตั้งใหม่ไม่ได้ผลให้ลองถอนการติดตั้งก่อนจากนั้นทำความสะอาดโปรเจ็กต์จากนั้นปิดทุกอย่างเปิดโปรเจ็กต์ใหม่และสร้าง + รัน ที่ควรจะทำงาน


0

หากโปรเจ็กต์ของคุณทำงานบนเครื่องจำลอง แต่ไม่ได้อยู่บนอุปกรณ์ให้ลองเรียกใช้เวอร์ชันสร้างบนอุปกรณ์ของคุณแทนการสร้างดีบัก

เลือกโครงการของคุณ -> ผลิตภัณฑ์ -> แก้ไขโครงร่าง -> การกำหนดค่าการสร้าง [แก้ปัญหา -> ปล่อย]

ตอนนี้เรียกใช้โครงการอีกครั้งมันจะทำงาน


0

ฉันประสบปัญหานี้เช่นกัน แต่เมื่อฉันเปลี่ยนModelName.xcdatamodeldไฟล์มันใช้งานได้ ดังนั้นฉันคิดว่าModelName.xcdatamodeld ไฟล์ไม่ได้ถูกเพิ่มอย่างถูกต้องดังนั้นเมื่อตรวจสอบและทำความสะอาดแอพแล้วเรียกใช้


0

หลังจากฉันแก้ไขปัญหาการตั้งชื่อแล้วข้อผิดพลาดยังคงอยู่ จากนั้นจะใช้งานได้หลังจากรีสตาร์ท Xcode 5 สิ่งนี้อาจทำสิ่งเดียวกันโดยอัตโนมัติกับคำแนะนำการเชื่อมโยงด้วยตนเองที่มีให้ที่นี่


0

สำหรับฉันปัญหาเกิดจากการที่ฉันคัดลอกวางโมเดลของฉันจากโครงการแซนด์บ็อกซ์ไปยังโครงการจริงของฉัน ตรวจสอบให้แน่ใจเสมอว่าได้สร้างโมเดลของคุณจากภายในโปรเจ็กต์ที่ใช้โมเดล


0

ฉันต้องเผชิญกับข้อผิดพลาดเดียวกันนี้เมื่อฉันเปลี่ยนชื่อ.xcdatamodelไฟล์จาก Xcode และเปลี่ยนชื่อเปลี่ยนชื่อเป็นผู้รับมอบสิทธิ์แอปใดก็ตามที่มันเป็นสิ่งที่จำเป็น แต่ฉันยังคงมีข้อผิดพลาดเดียวกัน ขั้นตอนที่แนะนำไม่ได้ผลสำหรับฉัน

จากนั้นฉันก็เปิดโฟลเดอร์ในFinderและพบไฟล์เพิ่มเติม.xccurrentversionพร้อมกับ.xcdatamodelไฟล์ ฉันเปิดมันในTextEditแอพและเปลี่ยนสิ่งนี้:

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

ฉันใช้สิ่งนี้กับ Xcode 6.4, OSX Yosemite 10.10.1

ฉันหวังว่ามันจะช่วยได้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.