iOS核心数据+ iCloud存储迁移错误

时间:2015-11-29 05:00:22

标签: ios core-data save icloud nsmanagedobjectcontext

我正在开发基于核心数据+ iCloud的IOS应用程序。 我从apple获取了示例代码并对其进行了修改 我正在测试从后备迁移到iCloud存储的方案。 我通过在手机中禁用和启用icloud驱动器来模拟这个场景。 我正在使用带有IOS8.1的iPhone 6 Xcode 6.3.2

我在后备商店中只创建了一条记录。 只有一个实体(医生)和一个属性(名称)

seedPSC - 后备商店 _psc -cloudstore

迁移时,我在保存moc时遇到以下错误。 请告诉我导致此错误的原因 --------错误------

2015-11-29 08:28:21.136 PlusData[187:3153] isicloudavailable 1
Using local storage: 1
2015-11-29 08:28:21.307 PlusData[187:3153] Added iCloud Store

2015-11-29 08:28:21.315 PlusData[187:3153] moving fallback to icloud
2015-11-29 08:28:21.335 PlusData[187:3153] addperson count 1 
2015-11-29 08:28:21.339 PlusData[187:3153] addperson name fff
2015-11-29 08:28:21.342 PlusData[187:3153]  moc sucess 0
2015-11-29 08:28:21.346 PlusData[187:3153]  moc save  localerror Error Domain=NSCocoaErrorDomain Code=134020 "The operation couldn’t be completed. (Cocoa error 134020.)" UserInfo=0x17027acc0 {NSAffectedObjectsErrorKey=<NSManagedObject: 0x1702a27c0> (entity: Doctors; id: 0x170233900 <x-coredata://C1497C22-DCCC-4351-8EC6-93DE69D31F81/Doctors/tC0919182-F606-4D49-B2CF-72B064503CF02> ; data: {
    name = fff;
}), NSUnderlyingException=Store <NSSQLCore: 0x125e17320> (URL: file:///var/mobile/Containers/Data/Application/0188F553-8B2A-4B17-B55A-568D9DEA1DEE/Documents/PlusDaraStores/9A133545-F7AD-43C2-A5D6-AF4D1DACC5B3/CoreDataUbiquitySupport/mobile~3C7CB5E4-5917-4A3D-AB89-0FC8985D8CDE/iCloudStore/189A6953-A96B-4773-8E8D-C4BA1B0422E1/store/iCloudStore.sqlite) cannot hold instances of entity (<NSEntityDescription: 0x1703406e0>) name Doctors, managedObjectClassName NSManagedObject, renamingIdentifier Doctors, isAbstract 1, superentity name (null), properties {
    name = "(<NSAttributeDescription: 0x1701352c0>), name name, isOptional 1, isTransient 0, entity Doctors, renamingIdentifier name, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 700 , attributeValueClassName NSString, defaultValue (null)";
}, subentities (null), userInfo {
}, versionHashModifier (null)}

    - (BOOL)seedStore:(NSPersistentStore *)store withPersistentStoreAtURL:(NSURL *)seedStoreURL error:(NSError * __autoreleasing *)error {


    BOOL success = YES;
    NSError *localError = nil;

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
    NSPersistentStoreCoordinator *seedPSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    NSDictionary *seedStoreOptions = @{ NSReadOnlyPersistentStoreOption : [NSNumber numberWithBool:YES] };
    NSPersistentStore *seedStore = [seedPSC addPersistentStoreWithType:NSSQLiteStoreType
                                                         configuration:nil
                                                                   URL:seedStoreURL
                                                               options:seedStoreOptions
                                                                 error:&localError];
    if (seedStore) {
        NSManagedObjectContext *seedMOC = [[NSManagedObjectContext alloc] init];
        [seedMOC setPersistentStoreCoordinator:seedPSC];

        //fetch all the person objects, use a batched fetch request to control memory usage
        NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"Doctors"];
        NSUInteger batchSize = 5000;
        [fr setFetchBatchSize:batchSize];

        NSArray *people = [seedMOC executeFetchRequest:fr error:&localError];
         NSLog(@"addperson count %ld ",people.count);

        NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

        [moc setPersistentStoreCoordinator:_psc];
        NSUInteger i = 1;
        for (Doctor *person in people) {
            NSLog(@"addperson name %@",person.name);

            [self addPerson:person toStore:store withContext:moc];
            if (0 == (i % batchSize)) {
                success = [moc save:&localError]; //seedstore
                if (success) {
                    /*
                     Reset the managed object context to free the memory for the inserted objects
                     The faulting array used for the fetch request will automatically free objects
                     with each batch, but inserted objects remain in the managed object context for
                     the lifecycle of the context
                     */
                    [moc reset];
                } else {
                    NSLog(@"Error saving during seed: %@", localError);
                    break;
                }
            }

            i++;
        }

        //one last save
        if ([moc hasChanges]) {
            NSLog(@" moc save  called");
            success = [moc save:&localError];
            NSLog(@" moc sucess %ld",success);
            NSLog(@" moc save  localerror %@",localError);
            [moc reset];
        }
    } else {
        success = NO;
        NSLog(@"Error adding seed store: %@", localError);
    }

    if (NO == success) {
        if (localError  && (error != NULL)) {
            *error = localError;
        }
    }

    return success;
}

- (void)addPerson:(Doctor *)person toStore:(NSPersistentStore *)store withContext:(NSManagedObjectContext *)moc {
    //save is done in called function

    NSEntityDescription *entity = [person entity];
    Doctor *newPerson = [[Doctor alloc] initWithEntity:entity
                           insertIntoManagedObjectContext:moc];

    newPerson.name = person.name;


    [moc assignObject:newPerson toPersistentStore:store];


}

0 个答案:

没有答案