Objective c 核心数据未更新,已更新模型

Objective c 核心数据未更新,已更新模型,objective-c,xcode,cocoa,core-data,Objective C,Xcode,Cocoa,Core Data,我有一个非常奇怪的问题,这让我相当困惑 我有一个核心数据实体,我刚刚添加了一些新属性: 删除-布尔 删除日期 我有以下代码,按此键可在核心数据对象上设置这两个值: - (IBAction)deleteButtonInTable:(id)sender { //Get the ID of the currently selected item in the table NSInteger selected = [self.tweetTableView rowForView:sen

我有一个非常奇怪的问题,这让我相当困惑

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

删除-布尔 删除日期

我有以下代码,按此键可在核心数据对象上设置这两个值:

- (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中观察对象时有一些中断,我可以在通过函数时看到对象上的属性更改,但是我有一个表显示一个数据源,该数据源经过过滤,仅显示已删除bool设置为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

另一方面,我使用与第一节完全相同的代码来设置过滤对象上的其他属性,这似乎很好

需要检查的事项:

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

  • 您是否使用新模型版本正确移植了模型

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

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

    需要检查的事项:

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

  • 您是否使用新模型版本正确移植了模型

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


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

    加载表视图之前,请尝试保存管理对象上下文

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


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

    在加载表视图之前,请尝试保存管理对象上下文

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


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

    您不应将与
    isDeleted
    方法的
    NSManagedObject

    比较一下,对那个问题作一个简短的分析

    还有其他导致冲突的属性名称,例如“更新”(比较)。不幸的是,在编译时或运行时没有警告,
    关于可接受属性名称的文档也相当模糊。

    您不应该将与
    isDeleted
    方法的
    NSManagedObject

    比较一下,对那个问题作一个简短的分析

    还有其他导致冲突的属性名称,例如“更新”(比较)。不幸的是,在编译时或运行时没有警告,
    关于什么是可接受的属性名称的文档也很模糊。

    Compare-你不应该称属性为“deleted”。嗨,Martin,就是这样,DOH!!!!!你能把它作为答案贴出来吗?我会选择它的。真不敢相信我花了这么长时间!比较-你不应该称一个属性为“已删除”。嗨,马丁,这正是它,DOH!!!!!你能把它作为答案贴出来吗?我会选择它的。真不敢相信我花了这么长时间!您还可以使用此:
    @YES
    @Mundi:绝对,至少在他使用最新版本的SDK时是这样。您还可以使用此:
    @YES
    @Mundi:绝对,至少在他使用最新版本的SDK时是这样。