MagicalRecord 3.0 不保存。第二次构建没有对象
Posted
技术标签:
【中文标题】MagicalRecord 3.0 不保存。第二次构建没有对象【英文标题】:MagicalRecord 3.0 not saving. No objects for the second build 【发布时间】:2014-11-24 19:09:01 【问题描述】:我是第一次试用 MagicalRecord 3.0,但无法使用。
这就是我正在做的。
1- 设置堆栈:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
[MagicalRecord setupClassicStackWithSQLiteStoreNamed:@"Model"];
我的模型名称是“Model.xcdatamodeld”。
2- 创建实体并保存:
Preferences *p = [Preferences createEntity];
p.visibilityWindow = @"08:00-23:30";
[[NSManagedObjectContext MR_context] saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error)
if (success)
NSLog(@"You successfully saved your context.");
else if (error)
NSLog(@"Error saving context: %@", error.description);
];
3- 加载数据:
NSArray *matches;
NSError * error = nil;
matches = [Preferences MR_findAll];
Preferences *p = nil;
NSLog(@"Fetch request data %@",matches);
if(!matches || error || ([matches count] >1))
//handle error;
NSLog(@"Error %@ matches count %lu", error, (unsigned long)[matches count]);
else if ([matches count])
p = [matches firstObject];
NSLog(@"Preferences found in coredata %@", p);
else
NSLog(@"No matches %i", [matches count]);
正如文档所示,我也在“清理”:
- (void)applicationWillTerminate:(UIApplication *)application
[MagicalRecord cleanUp];
当我使用传统的核心数据框架时,它工作得很好。
它说我保存成功。但是当我退出应用程序并尝试再次运行它时,它不再工作了。 我做错了什么?
此外,从我阅读的帖子中,每个人都在谈论“MR_defaultContext”。它被弃用了吗?
【问题讨论】:
【参考方案1】:几个想法:
查看 MagicalRecord 3.0 的代码,MR_context
返回NSPrivateQueueConcurrencyType
。使用 MR_createEntity
似乎使用了不同的主队列上下文。尝试使用MR_createEntityInContext:
创建您的实体并传入MR_context
。
另外,在不知道何时调用这三个方法的情况下,尝试使用MR_saveToPersistentStoreAndWaitWithError:
。
编辑: 最快的测试方法可能是更改第 2 步:
Preferences *p = [Preferences createEntity];
p.visibilityWindow = @"08:00-23:30";
NSError *error; // add this
BOOL success = [p.managedObjectContext MR_saveToPersistentStoreWithError:error] // change this
if (success)
NSLog(@"You successfully saved your context.");
else if (error)
NSLog(@"Error saving context: %@", error.description);
【讨论】:
似乎不起作用。不会从创建实体返回。甚至没有达到保存方法。将尝试保存在主队列上下文中。 我还应该指出MR_findAll
ALSO 使用不同的主队列上下文,因此如果您仍在使用MR_context
,则需要调用MR_findAllInContext:[NSManagedObjectContext MR_context]]
。
我认为在 3.0 中你想使用[[MagicalRecordStack defaultStack] context]
。这似乎等同于旧的MR_defaultContext
。
最后一条评论有效。非常感谢@Aaron !!您可以编辑实际答案,以便我接受。【参考方案2】:
我遇到了同样的问题...我使用了(与你的东西一起)我还添加了使用UIBackgroundTaskIdentifier 存储的选项(可选)
--
Preferences *p = [Preferences createEntity];
p.visibilityWindow = @"08:00-23:30";
[SomethingManagerObject saveIntoContext]
--
SomethingManagerObject
+ (void) saveWithContext
// THIS IS opcional!!! -> Prepar for BackgroundTask
UIApplication * application = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
];
// Get the context
NSManagedObjectContext *localContext = [[MagicalRecordStack defaultStack] context];
// Save the modification in the context
[localContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error)
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
];
或者您可以使用实体的 managedObjectContext 保存。在saveWithContext
方法中只需添加参数并发送p.managedObjectContext
。内改[[MagicalRecordStack defaultStack] context]
SomethingManagerObject 是一个 NSObject,您可以使用它来拥有类似的类方法...保存...创建...
【讨论】:
以上是关于MagicalRecord 3.0 不保存。第二次构建没有对象的主要内容,如果未能解决你的问题,请参考以下文章
MagicalRecord 2.3.0/3.0 在对象内保存对象
如何确保在使用 MagicalRecord 3.0 保存后台线程后通知 NSFetchedResultsController
MagicalRecord release/3.0 - 日志记录不起作用