相关疑难解决方法(0)

合并两个iOS核心数据持久存储的有效方法是什么?

在我们正在开发的应用程序中,我们使用Core Data和sqlite后备存储来存储我们的数据.我们的应用程序的对象模型很复杂.此外,我们的应用程序提供的数据总量太大,无法容纳到iOS(iPhone/iPad/iPod Touch)应用程序包中.由于我们的用户通常只对数据的一个子集感兴趣,因此我们对数据进行了分区,使得应用程序附带了一个子集(尽管大约100 MB)的数据对象.应用包.我们的用户可以选择在通过iTunes应用内购买支付额外内容后,从我们的服务器下载其他数据对象(大小约为5 MB到100 MB).增量数据文件(存在于sqlite后备存储中)使用与bundle附带的数据相同的xcdatamodel版本; 对象模型没有任何变化.增量数据文件作为gzip sqlite文件从我们的服务器下载.我们不希望通过随应用程序发送增量内容来扩大我们的应用程序包.此外,我们不希望依赖webservice上的查询(因为复杂的数据模型).我们测试了从服务器下载的增量sqlite数据.我们已经能够将下载的数据存储添加到应用程序的共享persistentStoreCoordinator中.  

{
       NSError *error = nil;
       NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                                [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

       if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:defaultStoreURL options:options error:&error])
       {            
           NSLog(@"Failed with error:  %@", [error localizedDescription]);
           abort();
       }    

       // Check for the existence of incrementalStore
       // Add incrementalStore
       if (incrementalStoreExists) {
           if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:incrementalStoreURL options:options error:&error])
           {            
               NSLog(@"Add of incrementalStore failed with error:  %@", [error localizedDescription]);
               abort();
           }    
       }
 }
Run Code Online (Sandbox Code Playgroud)

  但是,这样做有两个问题.

  1. 数据获取结果(例如,使用NSFetchResultController)显示来自incrementalStoreURL的数据附加到defaultStoreURL的数据末尾.
  2. 一些对象是重复的.在我们的数据模型中有许多具有只读数据的实体; …

merge core-data objective-c object-graph core-data-migration

10
推荐指数
1
解决办法
5541
查看次数

NSPersistentStoreCoordinator有两种类型的持久存储?

在iOS应用程序,我想用一个NSPersistentStoreCoordinator既与NSIncrementalStore子类,从一个REST API获取数据,而且还和SQLite存储,保存到磁盘.但是,如果我将两种类型的持久存储添加到协调器,则调用save:我的托管对象上下文不起作用.如果我只添加一个持久存储,而不是我的NSIcrementalStore子类的类型,那么保存按预期工作.

有没有办法实现这个功能?

core-data ios

10
推荐指数
1
解决办法
2984
查看次数

默认情况下,iPhone中的核心数据使用哪个持久性存储

我在我的应用程序中创建多个持久性存储,但我只使用一个持久性存储协调器和托管对象模型.现在我的问题是当我在托管对象上下文上调用save方法时,它将使用哪个持久性存储来保存对象.所以我想指定用于保存对象的持久性存储.从数据库中获取对象时,我想确保我的fetch查询应该在特定的商店上执行,这样我才能从该商店获取对象.有帮助吗?

iphone core-data persistent-storage ios

7
推荐指数
2
解决办法
3103
查看次数

如何避免更改 NSBatchInsertRequest 中的属性值?

我有一个简单的核心数据实体Story,偶尔会使用网络调用中的最新数据进行更新。此网络调用有时会更新很多很多故事实例,因此我运行一个NSBatchInsertRequest,如下所示。(我使用批量插入的另一个原因是可能需要将许多故事添加到持久存储中。)

问题是用户可能已经将 a 标记Story为收藏夹。当他们这样做时,我设置story.isFavorite = true主线程并保存viewContext

但是,当发生批量插入时,它会覆盖story.isFavorite,将其设置回false,即使我NSMergeByPropertyObjectTrumpMergePolicy同时在批量插入和视图上下文中使用。我也没有接触story.isFavorite批量插入处理程序,因此我不希望该属性被覆盖。

我认为使用此合并策略进行批量插入的好处是避免首先获取+然后手动更新更改的属性+最后保存。避免更改 中的属性值的正确方法是什么NSBatchInsertRequest

故事

@objc(Story)
public class Story: NSManagedObject {

    @NSManaged public var title:       String?
    @NSManaged public var storyURL:    URL?
    @NSManaged public var updatedTime: Date?
    @NSManaged public var isFavorite:  Bool // <- the problem property
}
Run Code Online (Sandbox Code Playgroud)

批量插入

container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
container.viewContext.automaticallyMergesChangesFromParent = false

let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
context.parent = container.viewContext
context.mergePolicy = …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchedresultscontroller nsfetchrequest nsmanagedobject nsmanagedobjectcontext

5
推荐指数
1
解决办法
1186
查看次数

将两个SQLite商店合二为一

假设我的应用程序文档目录中有两个SQLite文件.我如何将两者结合在一起并将它们保存为包含两者所有信息的单个文件?我是否真的必须创建两个持久性存储协调器并手动协调两者之间的过程,还是有一些更有效的方法呢?

-灰

sqlite iphone ios4

2
推荐指数
1
解决办法
1091
查看次数