Coredata - 使用配置来管理瞬态实体

时间:2013-02-26 08:30:52

标签: core-data memory sqlite entities transient

我正在尝试使用配置来管理核心数据中的瞬态实体。

  • 首先,我创建了2个名为“Persistent”和“Transient”的coredata配置。
  • 然后,我创建了实体,并将它们与正确的配置相关联 取决于实体是否可持久。
  • 最后,使用persistentStoreCoordinator,我创建了一个Sqlite类型的持久存储,并将其链接到“Persistent”配置。我还创建了一个类型内存的持久存储,并将其链接到“Transient”配置。

测试:我启动iphone模拟器,我的应用程序启动成功。我关闭模拟器和 在数据库文件上启动sqlite3。我列出了表(.tables命令),我能看到的是为瞬态实体创建了一些表=>所以,它不起作用。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    NSLog(@"++++++++ persistentStoreCoordinator");

    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSURL *persistStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ProjectToDelete.sqlite"];

    NSMutableDictionary *sqliteOptions = [NSMutableDictionary dictionary];
    [sqliteOptions setObject:@"WAL" forKey:@"journal_mode"];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                             sqliteOptions, NSSQLitePragmasOption,
                             nil];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"Persistent" URL:persistStoreURL options:options error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:@"Transient" URL:[NSURL URLWithString:@"memory://store"] options:nil error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}

2 个答案:

答案 0 :(得分:0)

我认为你正在混合CoreData的不同概念。

CoreData不是ORM,而是管理对象及其关系的对象图。

您可以在实体上拥有瞬态属性,这些属性不会在表示该实体的表中生成,仅在运行时生成,而对象在内存中。

抽象实体永远不会被实例化,如果你有很多从一个超级项目继承的对象,通常会使用它们,即员工管理系统可能有一个抽象的Person-entity,以及所有继承自人员的员工,经理,董事和经理

答案 1 :(得分:0)

正如评论中所提到的,尝试通过模型编辑器配置数据存储不会起作用。配置可能允许您添加预定的提取,但它们不允许您配置存储数据的位置。这是使用任何这些方法的关键。您需要添加一些代码,如博客文章中所述,以正确使用这些技术中的任何一种。