魔术记录,无法保存对象:contextDidSave == NO,错误= nil

伯格

我正在尝试保留新实体:

- (void)updateStorageWithQuizzess:(NSArray *)quizzess completion:(void(^)(NSArray *quizzess, BOOL succes, NSError *error))completion {
    NSMutableArray *mutableArray = [NSMutableArray array];

    [Quiz MR_truncateAll];
    [[NSManagedObjectContext MR_context] MR_saveWithBlock:^(NSManagedObjectContext *localContext) {

        for (NSDictionary *dictionary in quizzess) {
            Quiz *quiz = [Quiz MR_createEntity];
            [quiz fromDictionary:dictionary];
            [mutableArray addObject:quiz];
        }
    } completion:^(BOOL contextDidSave, NSError *error) {
        BlockSafeRun(completion, mutableArray, contextDidSave, error);
    }];
}

或像这样:

- (void)updateStorageWithQuizzess:(NSArray *)quizzess completion:(void(^)(NSArray *quizzess, BOOL succes, NSError *error))completion {
    NSMutableArray *mutableArray = [NSMutableArray array];

    [Quiz MR_truncateAll];

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        for (NSDictionary *dictionary in quizzess) {
            Quiz *quiz = [Quiz MR_createEntity];
            [quiz fromDictionary:dictionary];
            [mutableArray addObject:quiz];
        }
    } completion:^(BOOL contextDidSave, NSError *error) {
        BlockSafeRun(completion, mutableArray, contextDidSave, error);
    }];
}

但是在完成块中,我收到contextDidSave == NO,错误== nil。因此,我无法弄清楚出了什么问题。我犯了一些明显的错误吗?如何调试该问题?

//////

2015-06-17 20:39:27.061 HITO[6733:618953] Set root saving context: <NSManagedObjectContext: 0x16dbe070>
2015-06-17 20:39:27.062 HITO[6733:618953] Created new main queue context: <NSManagedObjectContext: 0x16e855b0>
2015-06-17 20:39:27.063 HITO[6733:618953] Set default context: <NSManagedObjectContext: 0x16e855b0>
2015-06-17 20:39:27.316 HITO[6733:618953] [HockeySDK] WARNING: Detecting crashes is NOT enabled due to running the app with a debugger attached.
2015-06-17 20:39:28.829 HITO[6733:618953] Created new private queue context: <NSManagedObjectContext: 0x16d57870>
2015-06-17 20:39:28.831 HITO[6733:619027] Created new private queue context: <NSManagedObjectContext: 0x16ea4ec0>
2015-06-17 20:39:28.841 HITO[6733:619027] NO CHANGES IN ** saveWithBlock:completion: ** CONTEXT - NOT SAVING

更新

以下来自MR的代码:

- (void) MR_saveWithOptions:(MRSaveOptions)saveOptions completion:(MRSaveCompletionHandler)completion;
{
    __block BOOL hasChanges = NO;

    if ([self concurrencyType] == NSConfinementConcurrencyType)
    {
        hasChanges = [self hasChanges];
    }
    else
    {
        [self performBlockAndWait:^{
            hasChanges = [self hasChanges];
        }];
    }

    if (!hasChanges)
    {
        MRLogVerbose(@"NO CHANGES IN ** %@ ** CONTEXT - NOT SAVING", [self MR_workingName]);

        if (completion)
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                completion(NO, nil);
            });
        }

        return;
    }

因此,hasChanges返回NO。

安东尼·MDev

您的对象在保存块中没有发生任何更改。我在这里看到两个问题。

  1. MR_defaultContext需要创建新对象,localContext这是保存块的保存上下文。

尝试这个:

- (void)updateStorageWithQuizzess:(NSArray *)quizzess completion:(void(^)(NSArray *quizzess, BOOL succes, NSError *error))completion {
    NSMutableArray *mutableArray = [NSMutableArray array];


    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        for (NSDictionary *dictionary in quizzess) {
            Quiz *quiz = [Quiz MR_createInContext:localContext];
            [quiz fromDictionary:dictionary];
            [mutableArray addObject:quiz];
        }
    } completion:^(BOOL contextDidSave, NSError *error) {
        BlockSafeRun(completion, mutableArray, contextDidSave, error);
    }];
}
  1. 在开始导入新对象之前,实际上并没有删除对象。这可能不会导致您的上下文没有任何变化,但我也会对此进行讨论。

[Quiz MR_truncateAll]只需将所有Quizobjectsdeleted属性设置为即可true这意味着下次保存或处理上下文时,更改将被保存。

因此,当您创建新的保存上下文时,该上下文仍然具有那些对象。我不确定您的fromDictionary方法在做什么,但是如果它依赖数据库,那么它就不会拥有它。

您需要这样做:

- (void)updateStorageWithQuizzess:(NSArray *)quizzess completion:(void(^)(NSArray *quizzess, BOOL succes, NSError *error))completion {
    NSMutableArray *mutableArray = [NSMutableArray array];


    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        [Quiz MR_truncateAllInContext:localContext];
        [localContext processPendingChanges];

        for (NSDictionary *dictionary in quizzess) {
            Quiz *quiz = [Quiz MR_createInContext:localContext];
            [quiz fromDictionary:dictionary];
            [mutableArray addObject:quiz];
        }
    } completion:^(BOOL contextDidSave, NSError *error) {
        BlockSafeRun(completion, mutableArray, contextDidSave, error);
    }];
}

这样,您将在保存上下文中删除对象。您还必须记住调用processPendingChanges保存上下文从上下文中删除对象,而不仅仅是将它们标记为要删除。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

NSManagedObjectContext保存失败,但返回nil错误

Nil:nil类错误,在每个循环上首先生成要构建页面的Form对象

ObjectiveRecord nil模型错误

nil指针嵌入错误

PSPDFKit给出错误`documentRef为nil,无法获取pageRef`

无法重定向到nil!(错误)-Rails 4嵌套表格

lein cljsbuild给出“无法编写JavaScript nil”错误

Ruby无法从Nil确定时区(参数错误)

魔术记录,保存对象

如果错误== nil解析迅速

CollectionView 错误 nil 布局参数

Swift:使用 self.moc.save() 保存核心数据时出现 Nil 错误

“'nil'不是与ActiveModel兼容的对象。它必须在micropost模型中实现:to_partial_path“错误

UITABLEVIEW致命错误:展开可选值时意外发现nil:更新Core Data对象时

rails 验证错误嵌套对象未定义方法... for nil:NilClass

从plist setObjectForKey加载图像:对象不能为nil(键:图像)错误

核心数据addPersistentStoreWithType返回nil,但错误也为nil

无法初始化本地 MSP:设置错误:nil conf 参考

PSPDFKit花费很长时间给出错误`documentRef为nil,无法获取pageRef`

Swift 无法初始化 UIImageView 并导致致命错误:意外发现 nil

卷的 AttachVolume.NewAttacher 失败:无法获取 GCE GCECloudProvider,错误为 <nil>

CoreData:尝试获取时错误返回 nil

可选的解开nil并不总是致命错误

为什么错误与nil不匹配?走

如何避免UIImageView中的Optional nil错误?

Lua错误尝试索引全局nil值

尝试索引全局“矩形”(nil值)错误

上下文?.save(nil)出现错误

与Quicksort中的nil错误进行比较