【问题标题】:Core Data not updating, updated model核心数据不更新,更新模型
【发布时间】:2013-07-25 14:35:22
【问题描述】:

我有一个非常奇怪的问题让我很困惑!

我有一个核心数据实体,我刚刚添加了一些新属性:

已删除 - 布尔值 删除日期 - 日期

我有以下代码,按下后会将这两个值设置在核心数据对象上:

- (IBAction)deleteButtonInTable:(id)sender {


    //Get the ID of the currently selected item in the table
    NSInteger selected = [self.tweetTableView rowForView:sender];

    //Create a predicate and fetch the objects from Core Data
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"approved == NO"];
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"postDate"  ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil];
    [request setPredicate:testForTrue];
    [request setSortDescriptors:sortDescriptors];

    [request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]];

    //Setup the Request
    [request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]];

    //Assign the predicate to the fetch request
    NSError *error = nil;

    //Create an array from the returned objects
    NSArray *fetchedObjects = [_managedObjectContext executeFetchRequest:request error:&error];

    Tweet *selectedTweet = [fetchedObjects objectAtIndex:selected];

    if (selectedTweet) {
        selectedTweet.deleted = [NSNumber numberWithBool:TRUE];
        selectedTweet.deletedDate = [NSDate date];
        NSLog(@"%@",selectedTweet);
        [self refreshTableView];
        if (! self.tweetTableView){
            NSLog(@"Tableview doesn't exist!!)");
        }
        [[self tweetTableView] reloadData];
        [[self managedObjectContext] commitEditing];
        [self saveAction:nil];
    }

    if ([self.autoWriteTweets isEqualToString:@"YES"]){
        [self writeTweetsToXML];
        [self saveAction:nil];
    }
}

现在,如果我在 xcode 中观察对象有一些中断,我可以在通过函数时看到对象的属性更改,但是我有一个显示数据源的表,该表被过滤为仅显示具有删除的布尔值设置为 true,并且什么都没有出现。

现在,为了让事情变得更加混乱,我有一个导出对象数组的函数:

-(void)writeTweetsToXML{
    //Create new fetch request
    NSFetchRequest *request = [[NSFetchRequest alloc] init];

    //Set new predicate to only fetch tweets that have been favourited
    NSPredicate *filterFavourite = [NSPredicate predicateWithFormat:@"approved == YES"];
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:self.exportSort ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil];
    [request setSortDescriptors:sortDescriptors];

    //Setup the Request
    [request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]];
    [request setResultType:NSDictionaryResultType];

    //Assign the predicate to the fetch request
    [request setPredicate:filterFavourite];
    NSError *error = nil;

    //Create an array from the returned objects
    NSArray *tweetsToExport = [_managedObjectContext executeFetchRequest:request error:&error];
    NSAssert2(tweetsToExport != nil && error == nil, @"Error fetching events: %@\n%@", [error localizedDescription], [error userInfo]);


     //NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    //NSString *path = [NSString stringWithFormat:@"%@/tweets.xml", documents];
NSString *writeerror;

    if(tweetsToExport) {
        NSString * exportLocationFull = [[NSString alloc]initWithFormat:@"%@/tweets.xml",self.exportLocation];
        BOOL success = [tweetsToExport writeToFile:exportLocationFull atomically:YES];
        NSLog(@"Write Status = %d to %@", success, exportLocationFull);
    }
    else {
        NSLog(@"%@",writeerror);

    }


}

现在,当我查看导出的文件时,发生了两件奇怪的事情!

首先,我看到的一个对象将它的删除值设置为 true,导出值为 0。

其次,deletedDate 属性根本不会导出,尽管它位于核心数据模型中。由于我没有对导出进行特定过滤,因此我看不出有任何可能发生这种情况。

就像某个地方的 getter/setter 坏了,但我检查了类文件,一切正常并设置为 @dynamic。

任何帮助将不胜感激,因为我对到底发生了什么有点迷茫。

人们曾警告过我有关核心数据的怪癖,但这很奇怪!

干杯

加雷斯

注 1

顺便说一句,我使用与第一部分完全相同的代码来设置过滤对象的其他属性,这似乎工作正常!

【问题讨论】:

  • 比较stackoverflow.com/questions/16000242/… - 你不应该将属性称为“已删除”。
  • 嗨,马丁,就是这样,DOH !!!!!!你能把它作为答案发布,我会选择它。不敢相信我花了多长时间!

标签: objective-c xcode cocoa core-data


【解决方案1】:

您不应将 Core Data 属性命名为“已删除”,这与 isDeletedNSManagedObject 方法。

比较 https://stackoverflow.com/a/16003894/1187415 以简要分析该问题。

还有其他会导致冲突的属性名称,例如“更新”(比较 Cannot use a predicate that compares dates in Magical Record)。不幸的是,在编译时或运行时没有警告, 并且关于什么是可接受的属性名称的文档也很模糊。

【讨论】:

    【解决方案2】:

    检查事项:

    1. 您是否使用[managedObjectContext save:&error] 将核心数据实体保存在适当的位置(例如,在显示新的表格视图数据之前)?你检查错误变量了吗?

    2. 您是否使用新的模型版本正确迁移了模型?

    3. 您是否读取了正确的属性并正确显示它们(在 UI 或日志语句中)?

    顺便说一句,在您的代码中,您将请求实体设置了两次。

    【讨论】:

      【解决方案3】:

      在加载表格视图之前尝试保存托管对象上下文。

      删除的布尔值可能之前为 0 且不会更改,也可能会自动初始化(检查器中有一个字段用于设置默认值)为 0。另一方面,日期字段默认为 nil。

      附:在 Objective-C 中使用 [NSNumber numberWithBoolean:YES]

      【讨论】:

      • 你也可以使用这个:@YES
      • @Mundi:当然,至少如果他使用的是最新版本的 SDK。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多