将 PersistentStoreCoordinator 从本地迁移到 iCloud 时数据重复

Posted

技术标签:

【中文标题】将 PersistentStoreCoordinator 从本地迁移到 iCloud 时数据重复【英文标题】:Data duplicate while migrate PersistentStoreCoordinator from local to iCloud 【发布时间】:2015-07-17 14:22:30 【问题描述】:

我正在使用核心数据进行 iCloud 同步工作正常。现在我想添加开/关开关(迁移商店)。如果我将商店迁移到 iCloud 到本地工作正常,但如果迁移回 iCloud 数据会重复。即使我尝试在迁移之前删除无处不在的容器也无济于事。我无法删除重复数据,因为重复数据后未调用“StoreDidImportUbiquitousContent”方法。

代码如下:

        // Migrate to local 

    -(NSURL *)localStoreURL
    
        NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"LocalExpns.sqlite"];
        return storeURL;

    

  - (void)moveStoreToLocal
      
         NSError *error = nil;
            NSPersistentStoreCoordinator * persistentStoreCoordinator = self.persistentStoreCoordinator;

            NSPersistentStore * persistentStore = [[persistentStoreCoordinator persistentStores] firstObject];

            if([[NSFileManager defaultManager]fileExistsAtPath:[self localStoreURL].path])
            
                NSLog(@"File exists");
                [[NSFileManager defaultManager] removeItemAtPath:[self localStoreURL].path error:& error];
                NSLog(@"Removing error = %@", error);

            

            NSMutableDictionary *localStoreOptions = [[self localStoreOptions] mutableCopy];
            [localStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSPersistentStoreRemoveUbiquitousMetadataOption];

           id result = [persistentStoreCoordinator migratePersistentStore:persistentStore toURL:[self localStoreURL] options:localStoreOptions withType:NSSQLiteStoreType error:&error];


以上代码运行良好。

// 迁移回 iCloud

// fileURL 为本地文件地址

-(NSURL *)storeURL

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Expns.sqlite"];
    return storeURL;



    - (void)moveStoreFileToICloud:(NSURL*)fileURL 
    
     NSPersistentStoreCoordinator * persistentStoreCoordinator = self.persistentStoreCoordinator;

            id sourceStore = [[persistentStoreCoordinator persistentStores] firstObject];

            if (!sourceStore) 

                NSLog(@" failed to add old store");

             else 
                NSLog(@" Successfully added store to migrate");

                bool moveSuccess = NO;
                NSError *error;


                NSLog(@" About to migrate the store...");
                // Now migrate the store using the iCloud options
                id migrationSuccess = [self.persistentStoreCoordinator migratePersistentStore:sourceStore toURL:[self storeURL] options:[self icloudStoreOptions] withType:NSSQLiteStoreType error:&error];

                if (migrationSuccess) 
                    moveSuccess = YES;
                    NSLog(@"store successfully migrated");

                    // Now delete the local file
                    if (shouldDelete) 
                        NSLog(@" deleting local store");
                        [self deleteLocalStore];
                     else 
                        NSLog(@" not deleting local store");
                    
                
                else 
                    NSLog(@"Failed to migrate store: %@, %@", error, error.userInfo);
                

            
    

现在数据会与迁移之前的数据重复。我试图删除无处不在的容器也没有帮助。

【问题讨论】:

您实际上是将数据添加到云中两次,这就是您得到重复数据的原因。处理此问题的建议方法是在同步后对数据进行重复数据删除。谷歌搜索会给你一些代码来做到这一点。这是一个:atomicbird.com/blog/icloud-complications-part-2 嗨@DrewMcCormack 感谢您的回复。我也试过了,它告诉storedidimport中的重复数据删除:。当我有两个设备时它工作正常。如果我只有一个设备 storedidimport: 方法没有被调用并且数据被复制了。 嗯,你确定吗?我原以为只要对商店进行背景更改以进行同步,就会发布 NSPersistentStoreDidImportUbiquitousContentChangesNotification 。我认为如果你在那里进行重复数据删除,它应该总是有效的。 @DrewMcCormack 在将存储从本地更改为 iCloud 时(使用单个设备时)未调用 NSPersistentStoreDidImportUbiquitousContentChangesNotification(这将在 iCloud sdk 更改条目后调用,对吗?)。现在我在获取数据时进行了重复数据删除。我知道这不是一个好方法,但它确实有效。你有更好的主意吗? 【参考方案1】:

我已经通过像this 那样手动删除我的数据库来解决这个问题

【讨论】:

以上是关于将 PersistentStoreCoordinator 从本地迁移到 iCloud 时数据重复的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等

如何将视频文件转换格式

sh 一个将生成CA的脚本,将CA导入到钥匙串中,然后它将创建一个证书并与CA签名,然后将其导入到

python怎么将0写入文件?

如何将CMD窗口背景改成透明?