首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用核心数据模型而不保存它们?

如何使用核心数据模型而不保存它们?
EN

Stack Overflow用户
提问于 2012-12-22 15:34:08
回答 2查看 3.9K关注 0票数 8

我正在编写一个应用程序,我使用MagicalRecord作为与核心数据交互的框架。应用程序从服务器获取一组海报,然后显示它们。如果用户需要,还可以在应用程序上创建海报,然后上传到服务器。

因此,用户创建的海报使用Core数据存储在本地数据库中,而从服务器获取的海报只应显示在应用程序中,而不应保存在本地。如何使用同一个海报类(现在是NSManagedObject的子类)来处理这两种情况?

这是我的班级:

代码语言:javascript
复制
@interface Poster : NSObject
@property (nonatomic, retain) NSNumber * posterID;
@property (nonatomic, retain) NSString * artists;
@end

当我从服务器获取海报数组时,我分配一个新的海报,然后分配属性:

代码语言:javascript
复制
Poster *poster = [[Poster alloc] init];
if ([dict objectForKey:@"id"]) poster.posterID = [dict objectForKey:@"id"];
if ([dict objectForKey:@"artists"]) poster.artists = [dict objectForKey:@"artists"];

但是,当到达链接的poster.posterID = [dict等]时,应用程序会出现此错误。

由于“NSInvalidArgumentException”异常终止应用程序,原因:‘-海报setPosterID::未识别的选择器发送到实例0xaa8b160’

如果我用Poster *poster = [Poster createEntity];而不是Poster *poster = [[Poster alloc] init];创建新对象,应用程序不会崩溃,但是当我保存上下文时,我发现从服务器获取的所有海报都是本地保存的。

我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-22 17:55:31

您不能只是alloc/init托管对象,因为托管对象必须与托管对象上下文相关联。poster.posterID = ...崩溃是因为动态创建的访问器方法在没有托管对象上下文的情况下无法工作。(更正:正如@noa正确地说的那样,只要使用指定的初始化器,就可以创建没有托管对象上下文的对象。但是这些对象对任何获取请求都是不可见的。)

要创建不应该保存到磁盘的托管对象,可以使用两个持久存储:一个SQLite存储和一个单独的内存存储。

我不能告诉您如何使用MagicalRecord来实现这一点,但是对于“普通核心数据”,它的工作方式如下:

在创建托管对象上下文和持久核心协调器之后,将两个持久存储分配给存储协调器:

代码语言:javascript
复制
NSPersistentStore *sqliteStore, *memStore;

sqliteStore = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error];
if (sqliteStore == nil) {
    // ...
}
memStore = [coordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error];
if (memStore == nil) {
    // ...
}

稍后,当您向上下文中插入新对象时,可以将新对象与SQLite存储或内存存储关联起来:

代码语言:javascript
复制
Poster *poster = [NSEntityDescription insertNewObjectForEntityForName:@"Poster" inManagedObjectContext:context];
[context assignObject:poster toPersistentStore:memStore];
// or: [context assignObject:poster toPersistentStore:sqliteStore];
poster.posterID = ...;
poster.artists = ...;

只将分配给SQLite存储的对象保存到磁盘中。如果重新启动应用程序,分配给内存存储的对象将消失。我认为没有显式分配给存储的对象会自动分配给第一个存储区,在本例中是SQLite存储。

我还没有使用过MagicalRecord,但是我发现有一些方法是MR_addInMemoryStoreMR_addSqliteStoreNamed,它们将是这种配置的适当方法。

票数 12
EN

Stack Overflow用户

发布于 2012-12-22 18:11:07

您也可以尝试对第二个参数使用指定的初始化器-initWithEntity:insertIntoManagedObjectContext:和nil。(在我的经验中,托管对象的某些方面在没有上下文的情况下工作得很好,而其他方面则不然。)

this answer中还有一些进一步的解释。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14004055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档