核心数据:写时复制实体?

Posted

技术标签:

【中文标题】核心数据:写时复制实体?【英文标题】:Core Data: copy-on-write entities? 【发布时间】:2015-04-29 07:54:01 【问题描述】:

我们需要在 ios 应用程序包中发送大量种子数据。但是,应用程序需要根据需要更新来自服务器的数据。来自服务器的更新需要根据需要“覆盖”种子数据。

计划是有两个持久存储,“a”和“b”,其中“a”是从应用程序包中安装的只读持久存储,“b”是读写持久存储。我们需要两个商店共享相同的模型(和实体)以保持应用程序逻辑简单。因此,如果一个实体被修改并且它最初在存储“a”中,则修改应该保存在存储“b”中,这会覆盖“a”中存在的任何属性。本质上,它是一种“写时复制”范例。

问题是:

这在 Core Data 中可以实现吗?怎么样? 如果不可行,是否有其他替代方法可以拥有大量种子数据,但又不会在用户设备上复制(也就是浪费)空间?

【问题讨论】:

为什么需要存储“a”(只读的)?您不能在应用程序包中提供预先填充的数据,然后只使用一个商店吗? @MichałCiuba 种子数据非常大,因此从应用程序包中复制数据(以便可以写入)需要复制数据,这对用户来说并不“礼貌” .当用户安装它时,其中一些种子数据项可能会过时,因此需要部分更新。此外,应用程序的每次更新也需要更新这些数据,如果现有数据文件已经包含用户内容,我们不能只覆盖它。 【参考方案1】:

保存新数据:

Store *newStoreItem = [NSEntityDescription insertNewObjectForEntityForName:@"Store"
                                                                        inManagedObjectContext:self.managedObjectContext];

                newStoreItem.store_id       = [[data objectAtIndex:i] valueForKey:@"id"];
                newStoreItem.lat            = [[data objectAtIndex:i] valueForKey:@"lat"];
                newStoreItem.lng            = [[data objectAtIndex:i] valueForKey:@"lng"];

然后在需要的时候检查一下:

- (BOOL) isStoreExist

    AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
    self.managedObjectContext = appDelegate.managedObjectContext;

        fetchedStoreItem = [[appDelegate getStore_byID:store_id]mutableCopy];


    if ([fetchedStoreItem count] == 0)
    
        return NO;
    else
    
        return YES;

然后替换数据:

fetchedStoreItem = [[appDelegate getStore_byID:store_id]mutableCopy];

                 Store *oldStoreItem = [fetchedStoreItem objectAtIndex:0];

                 oldStoreItem.store_id       = [[data objectAtIndex:i] valueForKey:@"id"];
                 oldStoreItem.lat            = [[data objectAtIndex:i] valueForKey:@"lat"];
                 oldStoreItem.lng            = [[data objectAtIndex:i] valueForKey:@"lng"];

【讨论】:

以上是关于核心数据:写时复制实体?的主要内容,如果未能解决你的问题,请参考以下文章

C++ String的引用计数写时复制 的实现 《More Effective C++》

Linux写时复制(CopyOnWrite)|写时拷贝|rcu

利用“写时复制”将数据复制到 Multiprocessing.Pool() 工作进程

Linux 0.11-写时复制-30

Linux 0.11-写时复制-30

写时复制会防止阵列上的数据重复吗?