รูปแบบที่ใช้ในการเปิดร้านนั้นไม่เข้ากันกับแบบที่ใช้ในการสร้างร้านค้า


181

ฉันสร้างโมเดลข้อมูลแกนใน xcode 3.2 และหลังจากอัปเกรดใน Xcode 4.2 ฉันก็เพิ่มเอนทิตีใหม่ของคลาสย่อย NSManagedObject (อ้างอิงถึงเอนทิตีใหม่)

สิ่งแรกมันดูแปลกเพราะมันไม่ได้อยู่ในกลุ่มเดียวกันกับคนเก่า นี่คือภาพใน xcode ของฉัน 4.2 (AlkitabDB เป็นสิ่งที่ฉันสร้างขึ้นใน xcode 3.2 EndeDB เป็นรูปใหม่จาก xcode รุ่นปัจจุบัน (4.2):

นิติบุคคลใหม่ไม่ได้จัดกลุ่มใน xdatamodel

สิ่งที่สองฉันปล่อยให้มันเป็นอย่างนั้นจากนั้นฉันก็เข้าถึงเอนทิตีที่สอง (อันใหม่) แบบเดียวกับเอนทิตี้แรก (อันเก่า) และข้อผิดพลาดตามที่ชื่อปรากฏขึ้น

นี่คือข้อผิดพลาด:

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}

    7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
    8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
    9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

ฉันค้นหาวิธีแก้ปัญหาก่อนหน้านี้และพบว่าฉันควรลบแอปพลิเคชันออกจากโปรแกรมจำลองและเรียกใช้แอปอีกครั้งและไม่ได้ผล ไม่มีใครรู้วิธีแก้ปัญหาสำหรับปัญหานี้หรือไม่? กรุณาช่วย.

คำตอบ:


294

การลบแอปบางครั้งก็ไม่ใช่กรณี! แนะนำแอพของคุณเผยแพร่แล้ว! คุณไม่สามารถเพิ่มเอนทิตีใหม่ไปยังฐานข้อมูลและดำเนินการต่อ - คุณต้องทำการโยกย้าย!

สำหรับผู้ที่ไม่ต้องการขุดลงในเอกสารและกำลังค้นหาวิธีแก้ไขอย่างรวดเร็ว:

  1. เปิดไฟล์. xcdatamodeld ของคุณ
  2. คลิกที่ Editor
  3. เลือกเพิ่มรุ่นของรุ่น ...
  4. เพิ่มรุ่นใหม่ของแบบจำลองของคุณ (เพิ่มกลุ่มของ datamodels ใหม่)
  5. เลือกไฟล์หลักเปิดไฟล์ตรวจสอบ (แผงด้านขวา)
  6. และภายใต้Versioned core data modelเลือกรุ่นข้อมูลใหม่ของคุณสำหรับรูปแบบข้อมูลปัจจุบัน
  7. นั่นไม่ใช่ทั้งหมด) คุณควรดำเนินการที่เรียกว่า "การโยกย้ายแสง"
  8. ไปที่ของคุณAppDelegateและค้นหาตำแหน่งที่persistentStoreCoordinatorกำลังสร้าง
  9. ค้นหาบรรทัดนี้ if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. แทนที่nilตัวเลือกด้วย@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}(ให้ไว้จริงในรหัสความคิดเห็นในวิธีการนั้น)
  11. ไปเลยสนุกไปกับมัน!

PS สิ่งนี้ใช้สำหรับการย้ายข้อมูลแบบเบาเท่านั้น เพื่อให้การโยกย้ายของคุณมีคุณสมบัติเป็นการโยกย้ายที่มีน้ำหนักเบาการเปลี่ยนแปลงของคุณจะต้อง จำกัด อยู่ในแถบแคบ ๆ นี้:

  • เพิ่มหรือลบคุณสมบัติ (แอตทริบิวต์หรือความสัมพันธ์)
  • ทำให้คุณสมบัติที่ไม่ใช่ตัวเลือกเป็นตัวเลือก
  • สร้างแอตทริบิวต์ที่เป็นทางเลือกแบบไม่บังคับตราบใดที่คุณระบุค่าเริ่มต้น
  • เพิ่มหรือลบเอนทิตี
  • เปลี่ยนชื่อคุณสมบัติ
  • เปลี่ยนชื่อเอนทิตี

สำหรับ Swift 4

coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

2
ไฟล์หลักคือ. xcdatamodel ที่คุณสร้าง คุณควรเปิดแท็บแรกของบานหน้าต่างสาธารณูปโภค (ด้านขวามือด้านหนึ่ง) และค้นหา "รุ่นรุ่น" (Xcode 5.1) และเลือกปัจจุบัน: ".xcdatamodel รุ่นที่คุณสร้างขึ้นใหม่"
Stas

1
@ Computer_whiz123 ใน XCode 5.1.1 เรียกว่า 'Model Version'
Stas

1
ฉันจะทำสิ่งนี้ได้อย่างไรอย่างรวดเร็ว
Addison

2
ฉันได้รับข้อผิดพลาดนี้: "CoreData: ข้อผิดพลาด: -addPersistentStoreWithType: การกำหนดค่า SQLite: (null) URL: ไฟล์: ///...file.sqlite ตัวเลือก: {NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1; ... โดเมน = NSCocoaErrorDomain Code = 134130 "การดำเนินการไม่เสร็จสมบูรณ์ (ข้อผิดพลาดโกโก้ 134130) "
CarmenA

3
ตัวเลือกการโยกย้าย Swift:let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
HamzaGhazouani

285

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

หากคุณต้องการให้แน่ใจว่ามันหายไปให้ตรวจสอบไดเรกทอรีนี้Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/สำหรับโฟลเดอร์แอปของคุณภายใต้เวอร์ชันที่คุณใช้งาน

หมายเหตุ: นี่สำหรับการพัฒนาเท่านั้น สำหรับการผลิตคุณต้องใช้การย้ายข้อมูลบางประเภท Google "การย้ายข้อมูลหลัก" ด้วยการโยกย้ายที่มีน้ำหนักเบาเป็นวิธีที่ง่ายที่สุด


ขอบคุณสำหรับการตอบฟิลิปฉันพยายามและมันไม่ได้ทำงาน :( ทำ u มีข้อเสนอแนะอื่น ๆ ?
dejoong

คุณสามารถโพสต์รหัสที่คุณใช้สร้างโมเดลและร้านค้าถาวรในตัวแทนแอพของคุณได้หรือไม่?
Philippe Sabourin

มันค่อนข้างไม่มีเหตุผลว่าทำไมสิ่งนี้จึงเกิดขึ้นและทำไมวิธีแก้ปัญหาแบบนี้ทำไม่ได้ แต่นั่นก็ .. .. ไม่สามารถช่วย .. nywaz ต่อไปนี้การลงคะแนนของฉัน .. สิ่งที่ดีที่สุดที่ฉันสามารถทำได้ในตอนนี้เพื่อขอบคุณแนวทางของคุณ .. สำหรับเพื่อนช่วยด้วย !!
Apple_iOS0304

ช่วยฉันแก้ปัญหาใน Xcode 4.6 ที่ฉันส่งไปที่ถังขยะโครงการไฟล์ทั้งหมดของฉันโดยไม่ได้ตั้งใจ: /
ramirogm

6
นี่สำหรับการพัฒนาเท่านั้น! สำหรับการผลิตคุณใช้การกำหนดรุ่นและการย้ายข้อมูล developer.apple.com/library/ios/#documentation/cocoa/Conceptual/
......

35

เพียงเพิ่มคุณสมบัติตัวเลือกในขณะที่สร้าง persistentStoreCoordinator ในไฟล์ AppDelegate.m สำหรับวิธีการหลักของข้อมูลดังต่อไปนี้

Objective-C

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }

    NSLog(@"persistentStoreCoordinator___");
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];

    NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

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

    NSLog(@"persistentStoreCoordinator___2");
    return _persistentStoreCoordinator;
}

SWIFT

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    var failureReason = "There was an error creating or loading the application's saved data."

    // MAIN LINE OF CODE TO ADD
    let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
                    NSInferMappingModelAutomaticallyOption: true]

    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}

มันแก้ปัญหาของฉันได้แล้ว ..


1
ขอบคุณสำหรับโพสต์นี้มีประโยชน์จริงๆ
Subramani

23

คำตอบ:นำแอพออกจาก Simulator, ทำความสะอาดและสร้างโครงการของคุณใหม่

หมายเหตุ:เมื่อใดก็ตามที่คุณทำการเปลี่ยนแปลงข้อกำหนด Core Data ให้ลบแอพที่ติดตั้งในอุปกรณ์ทางกายภาพหรือเครื่องมือจำลองให้ล้างข้อมูลโครงการและสร้างใหม่อีกครั้ง


การรีเซ็ตเนื้อหาและการตั้งค่าในเครื่องมือช่วยแก้ไขปัญหาสำหรับฉัน! ขอบคุณ
septerr

14

ใช่. เมื่อคุณลบแอปบนอุปกรณ์ทางกายภาพและสร้างมันขึ้นมาใหม่


นี่เป็นการแก้ปัญหาของฉันมากกว่าคำตอบที่ยอมรับ ขอบคุณ!
Ken W

สิ่งที่เกิดขึ้นในการผลิตไม่ใช่คำตอบ
Eduardo Oliveros

นี่คือคำตอบที่น่ากลัวคุณต้องเพิ่มการย้ายไปยังรุ่นใหม่ของคุณมิฉะนั้นแอปจะทำงานผิดพลาดในระหว่างการผลิต
aryaxt

14

สำหรับ swift ใน AppDelegate.swift ค้นหาบรรทัด

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration:  nil, URL: url, options: nil )

และแทนที่ด้วย

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

11

ฉันเพิ่งใช้เวลาหลายวันในการต่อสู้กับข้อผิดพลาดนี้รวมถึงการผสานโมเดล ModromromBundles ล่มและการได้รับข้อผิดพลาด

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

หลังจากค้นหาโพสต์บล็อกนี้ผ่านทางคำตอบอื่นฉันทำให้แอพของฉันทนต่อรุ่นเก่ามากขึ้นโดยการเปลี่ยนบรรทัดนี้ซึ่งค้นหาไฟล์. mom ทั้งหมด:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

ซึ่งสิ่งนี้จะปรากฏเฉพาะในไดเรกทอรีตัวกรอง:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

ฉันใช้recursivePathsForResourcesOfTypeจากนี้ดังนั้นคำถาม : เพื่อช่วยคิดออกโดยการบันทึกไฟล์. mom ทั้งหมดในแอป:

NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]];
NSLog(@"All .mom files:%@",momPaths);

ฉันยังใช้iExplorerเพื่อดูไฟล์. extom ที่เกี่ยวข้อง (ฉันยังไม่ได้ลองลบ)

วิธีการด้านล่างก็มีประโยชน์เช่นกัน มันแสดงให้เห็นว่าเอนทิตีอยู่ในรูปแบบการผสานที่ส่งคืนโดย [psc managedObjectModel] ซึ่งไม่มีอยู่ในโมเดลของฉันหรือในร้านค้า นี่คือสิ่งที่ให้ฉันเชื่อว่ารุ่นเก่าถูกแคชบนตัวอุปกรณ์ว่าอาคารสะอาดไม่ได้ลบ วิธีการบันทึกแต่ละเอนทิตีที่เหมือนกันถูกเปลี่ยนแปลงหรือเพิ่มหรือลบออกจากโมเดล (เขียนด้วยคำตอบ SO นี้เป็นจุดเริ่มต้น):

- (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL {
    NSError *error = nil;

    // Get the entities & keys from the persistent store coordinator
    NSManagedObjectModel *pscModel = [psc managedObjectModel];
    NSDictionary *pscEntities = [pscModel entitiesByName];
    NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]];
    //NSLog(@"psc model:%@", pscModel);
    //NSLog(@"psc keys:%@", pscKeys);
    NSLog(@"psc contains %d entities", [pscModel.entities count]);

    // Get the entity hashes from the storeURL
    NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                                          URL:storeURL
                                                                                        error:&error];
    NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"];
    //NSLog(@"store metadata:%@", sourceMetadata);
    NSLog(@"store URL:%@", storeURL);
    NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]);
    NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]);
    NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]];

    // Determine store entities that were added, removed, and in common (to/with psc)
    NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys];
    NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *changedEntities = [NSMutableSet new];
    [addedEntities minusSet:storeKeys];
    [removedEntities minusSet:pscKeys];
    [commonEntities minusSet:removedEntities];
    [commonEntities minusSet:addedEntities];

    // Determine entities that have changed (with different hashes)
    [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
        NSData *storeHash = [storeHashes objectForKey:key];
        NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
        if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) {
            if (storeHash != nil && pscDescrip.versionHash != nil) {
                [changedEntities addObject:key];
            }
        }
    }];

    // Remove changed entities from common list
    [commonEntities minusSet:changedEntities];

    if ([commonEntities count] > 0) {
        NSLog(@"Common entities:");
        [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([changedEntities count] > 0) {
        NSLog(@"Changed entities:");
        [changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\tpsc   %@:\t%@", key, pscDescrip.versionHash);
            NSLog(@"\tstore %@:\t%@", key, storeHash);
    }];
    }
    if ([addedEntities count] > 0) {
        NSLog(@"Added entities to psc model (not in store):");
        [addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([removedEntities count] > 0) {
        NSLog(@"Removed entities from psc model (exist in store):");
        [removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSLog(@"\t%@:\t%@", key, storeHash);
        }];
    }

    BOOL pscCompatibile = [pscModel isConfiguration:nil     compatibleWithStoreMetadata:storeMetadata];
    NSLog(@"Migration needed? %@", pscCompatibile?@"no":@"yes");

    return pscCompatibile;
}

การใช้งาน: เรียกก่อนเพิ่มแต่ละร้านไปยัง NSPersistentStoreCoordinator:

    [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL];
    _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType
                                          configuration:nil
                                                    URL:self.iCloudStoreURL
                                                options:options
                                                  error:&localError];

10

ทุกครั้งที่คุณทำการเปลี่ยนแปลงข้อกำหนดของวันที่หลักคุณควรลบแอพที่ติดตั้งบนอุปกรณ์ทางกายภาพหรืออุปกรณ์จำลอง


20
แอพที่ใช้งานเกี่ยวกับการผลิตล่ะ? พวกเขาจะพังทันทีหรือไม่ถ้าคุณผลักดันการอัปเดตไปยัง App Store ด้วยการเปลี่ยนแปลง Core Data? ขอบคุณ
rwyland


3
ใช่การเปลี่ยนแปลงในรุ่นซีดีจะป้องกันข้อมูลที่สร้างขึ้นจากการโหลดรุ่นก่อนหน้า ในการจัดการกับสิ่งนี้คุณต้องตรวจสอบปัญหาและทำการย้ายข้อมูลหลัก
Johan


7

ทางออกที่ง่ายที่สุดที่ทำงานให้ฉันใน Swift 2.1, Xcode 7 คือ:

  1. ลบแอพออกจาก Simulator (Cmd + Shift + H เพื่อไปที่หน้าจอโฮมลองกดแอพคลิกกากบาทตามปกติที่คุณจะลบแอพออกจากโทรศัพท์ของคุณ)

  2. Cmd + Shift + H อีกครั้งเพื่อหยุดเต้นของแอพ

  3. กลับไปที่โครงการของคุณแล้วรันใหม่อีกครั้ง

ฉันมีปัญหานี้ในขณะที่เขียน / อ่านจาก Core Data ด้วยการตั้งค่า 2 เอนทิตี การลบแอพและเรียกใช้ซ้ำโปรแกรมแก้ไขปัญหา


2
การปฏิบัติที่ไม่ดีในการผลิตแอปผิดพลาด
Eduardo Oliveros

6

ฉันเพิ่งลบ[Simulator App Folder]/Document/*.sqliteไฟล์หลังจากทำการเปลี่ยนแปลงในเอนทิตีและทำงานได้ และแน่นอนไฟล์. sqlite มีข้อมูลและโครงสร้างที่เก็บไว้ทั้งหมดซึ่งจะหายไป


2
ทำงานให้ฉันด้วย ดูเหมือนสมเหตุสมผลที่ควรจะเพียงพอ คุณหลวมข้อมูลทั้งหมดที่มีอยู่แล้วใน DB แต่ ...
Bor

6

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


6

หากคุณใช้ Swift

ทำตามคำตอบโดย @Stas และใส่ตัวเลือกแทน nil ใน App Delegate ของคุณ:

let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {

1
ไม่แน่ใจว่าทำไมสิ่งนั้นถึงได้ถูกโหวตลง แต่ฉันได้ทำให้ถูกต้องแล้ว ขอขอบคุณที่แจ้งไวยากรณ์สำหรับ Swift
Matt Long

ดี! มันใช้งานได้! ขอบคุณ! ฉันกำลังพยายามแก้ไขปัญหานี้เป็นเวลา 3 ชั่วโมง
mr_ivan777

วางรหัสนี้ที่ไหน ฉันโหลดข้อมูลหลักด้วยรหัสนี้ให้ container = NSPersistentContainer (ชื่อ: "modeldb") container.loadPersistentStores (completionHandler: {(storeDescription, ข้อผิดพลาด) ในถ้าให้ error = ข้อผิดพลาดเป็น NSError?
จอห์น

5

ลอง "รีเซ็ตเนื้อหา & การตั้งค่า" ในโปรแกรมจำลอง ทำงานให้ฉันหลังจากลบแอพและ Clean build


3
อย่างไรก็ตามหากคุณทำเช่นนี้จะไม่เกิดปัญหาเดียวกันกับผู้ใช้ในเครื่องจริงหรือ
Maury Markowitz

4

ฉันประสบปัญหาเดียวกันกับแอพของฉัน (ยังไม่วางจำหน่ายใน App Store)

นี่คือวิธีที่ฉันแก้ไขมัน:

  1. Run Clean (Cmd + Shift + K)
  2. รีสตาร์ท iOS Simulator
  3. iOS Simulator -> รีเซ็ตเนื้อหาและการตั้งค่า (จาก navbar)

(3) เป็นขั้นตอนสุดท้ายที่ทำให้มันทำงานได้อย่างถูกต้อง หวังว่านี่จะช่วยได้!


2

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

หากเป็นกรณีนี้คุณต้องดูแลการย้ายข้อมูลเก่าไปยังสคีมาใหม่:

การกำหนดเวอร์ชันโมเดลข้อมูลหลักและการย้ายข้อมูล


2

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

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html


2

หากคุณทำการเปลี่ยนแปลงรูปแบบข้อมูลหลักของคุณคุณจะต้องจัดทำนโยบายการย้ายข้อมูลซึ่งบอกข้อมูลหลักของการใช้งานวัตถุที่มีอยู่ (ผู้ใช้ของคุณสร้างด้วยรุ่นที่เผยแพร่ในปัจจุบัน) กับรูปแบบใหม่

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

รายละเอียดสามารถพบได้ในหลักข้อมูลรุ่นรุ่นและย้ายข้อมูล Programming คู่มือ

อัปเดต
คำตอบนี้ที่นี่ในสแต็คโอเวอร์โฟลว์ครอบคลุมพื้นฐานของการย้ายข้อมูลแบบเบา ๆ ของ Core Data และยังมีรหัสบางอย่างเพื่อให้คุณเริ่มต้น


นี่คือคำตอบเดียวกันสำหรับการย้ายข้อมูล: stackoverflow.com/questions/8881453/…
Dhaval H. Nena

1

โดยทั่วไปปัญหานี้เกิดขึ้นเนื่องจากความเข้ากันไม่ได้ระหว่างรุ่นที่มีการสร้างฐานข้อมูล วิธีการทั่วไปในการแก้ไขปัญหานี้คือการลบ app และติดตั้งมัน แต่ในกรณีที่คุณกล่าวถึงเวอร์ชันของ DB จะแตกต่างอย่างสิ้นเชิงกับ Xcode 3.2 และ 4.2 ดังนั้นควรใช้ Xcode รุ่นเดียวกันกับ DB


1

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

ประการที่สองข้อผิดพลาดระบุว่า Core Data ไม่สามารถหาแบบจำลองของคุณ คุณสร้างข้อมูลแล้วแตะตัวแบบหรือไม่ ถ้าเป็นเช่นนั้นคุณจะอยู่ในสถานะที่ไม่สอดคล้องกันและจำเป็นที่จะต้องแก้ไขที่ทั้งโดยการลบข้อมูล (ซึ่งฟิลิปแนะนำ) หรือโดยการรีดการเปลี่ยนแปลงของคุณของรูปแบบย้อนกลับ


คุณมีความคิดว่าฉันจะนำแบบจำลองออกมาจากชุด xcdatamodel ได้อย่างไร? หรือฉันจะลบมันเหรอ?
dejoong

รุ่นซึ่งเป็นxcdatamodelไฟล์ควรอยู่ในนั้น เป็นไฟล์. h และ. m ที่ต้องย้าย ใช้ Finder
Marcus S. Zarra

0

ฉันได้รับข้อผิดพลาด แต่สาเหตุที่ทำให้เกิดข้อผิดพลาดนั้นเป็นเพราะสาเหตุต่อไปนี้

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

แก้ไข: โอ้และถ้าคุณกังวลเกี่ยวกับการลบเอนทิตีใหม่ของคุณ (ในกรณีของฉัน "บุคคล") เพื่อสร้างแอปอีกครั้งโปรดจำไว้ว่าคุณสามารถเรียกคืนได้ในภายหลังโดยใช้ CMD + Z!


0

ฉันมีปัญหานี้ - ฉันรีเซ็ตตัวจำลองของฉันก่อนแล้วจึงทำความสะอาดโครงการและสร้างใหม่ แล้วมันก็ใช้งานได้


0

เมื่อคุณเปลี่ยนข้อมูลหลัก (เพิ่มเขตข้อมูลลงในตารางลบฟิลด์ ฯลฯ ) ไฟล์ sqlite ในโฟลเดอร์เอกสารแอปพลิเคชันจะต้องซิงค์กับสคีมาของคุณ

ไฟล์นี้ไม่ถูกเขียนทับโดยค่าเริ่มต้นไฟล์นี้จำเป็นต้องสร้างใหม่

ทำตามขั้นตอนเหล่านี้:

  1. ไปที่โฟลเดอร์ที่ชี้โดย NSURL (เส้นทางนี้สามารถพบได้ในข้อความข้อยกเว้นที่สร้างขึ้นโดยแอปพลิเคชันก่อนที่จะหยุดทำงาน) ตัวอย่าง: / Users // Library / Application Support / iPhone Simulator // Applications // Documents

  2. ลบหรือเปลี่ยนชื่อไฟล์ sqlite

  3. ทำความสะอาดและเรียกใช้แอปพลิเคชันอีกครั้ง
  4. แอปพลิเคชันที่รันใหม่จะสร้างไฟล์ sqlite ใหม่

สิ่งนี้จะทำให้แน่ใจว่าสคีมาและ Xcode กำลังซิงค์กัน


-1

สำหรับการพัฒนาแอพ mac:

  1. ทำความสะอาดโครงการ
  2. ทำความสะอาดข้อมูลที่ได้รับ
  3. ไปที่ / Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents / และลบไฟล์ทั้งหมดที่อยู่ภายใน (เช่น ".sqlite", ".sqlite-shm" ... )

มันใช้งานได้สำหรับฉันหวังว่ามันจะมีประโยชน์


-2

iOS Simulator -> รีเซ็ตเนื้อหาและการตั้งค่า ...

ทำงานให้ฉัน

iOS Simulator -> รีเซ็ตเนื้อหาและการตั้งค่า ... -> รีเซ็ตการทำงานบน iOS9 (xcode 7.1) เช่นกัน


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