核心数据:写时复制实体?
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