【问题标题】:CoreData object not populating with valuesCoreData 对象未填充值
【发布时间】:2014-04-07 06:52:03
【问题描述】:

我有这段代码可以读取我的 coreData 并将其调整到 coredata 对象数组中。然后我将这些 coredata 对象之一放入它自己的 var 类型,但是并不是所有的属性都被填充开始。

这就是我的代码的样子。

NSMutableArray *tempFinishing = [coreDataController readFinishing];
    for (int i = 0; i < [tempFinishing count]; i++) {
        currentProject = [[Project alloc] init];
        currentProject = [tempFinishing objectAtIndex:i];

        if ([currentProject.hasChange isEqualToString:@"T"]) {

当我检查 hasChange 时,它​​返回为 nil...但这是奇怪的事情 如果我在控制台中执行此操作。

po currentProject.hasChange

返回零

po currentProject.myID 

返回我的 ID“1234”

然后

po currentProject.hasChange

returns "F" // 这是不正确的,它应该设置为 T 并且在它被更改时已经看到它被调试过......但是这只在我在终端中 po 时才有效..

更新

现在收到这些警告

Incompatible pointer types sending 'NSString *' to parameter of type 'NSEntityDescription *'
Incompatible pointer types initializing 'Project *' with an expression of type 'NSManagedObject *'

使用此代码。

NSManagedObjectContext *context = [self managedObjectContext];
        Project *currentProj = [[NSManagedObject alloc] initWithEntity:@"Project" insertIntoManagedObjectContext:context];

更新 2

这是我的 coredata readFinishing 方法。

- (NSMutableArray *)readFinishing {
    NSManagedObjectContext *context = [self managedObjectContext];
    if (context == nil) {
        NSLog(@"Nil");
    }
    else {
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:context];
        [fetchRequest setEntity:entity];
        NSError *error;
        NSMutableArray *projectDictionaryArray = [[NSMutableArray alloc] init];
        NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

        for (Project *projects in fetchedObjects) {
            [projectDictionaryArray addObject:projects];
        }
        return projectDictionaryArray;
    }
    return nil;
}

希望这有助于阐明一些问题.. 我已经为此工作了好几天.. :( 哈哈

更新 3

我想我可能已经找到了问题....在核心数据对象类中我决定随机查看我发现了这个..

现已更新为动态和测试...

【问题讨论】:

  • 从该代码中删除 currentProject = [[Project alloc] init]; 并显示 readFinishing 方法的代码。
  • 我已经更新了代码
  • 您的Project 课程是自动生成的?你做了什么修改?它具有的所有属性都在模型中定义?显示类的代码,也许是模型的屏幕截图。
  • 我很困惑,你有两个更新似乎改变了你正在使用的代码以及错误是什么。请重写您的问题,从头开始,因此没有更新。只需显示您拥有的当前代码,并描述您遇到的问题/错误。
  • @dynamic 解决了这个问题.. 显然我在自动生成核心数据对象后添加了 hasChange.. 然后因为 s 在键盘上接近 d 由于代码完成而我设法弄乱了它并且我的无能..

标签: ios objective-c core-data


【解决方案1】:

CoreData 对象必须分配给一个上下文,并且通常需要使用NSEntitiyDescription 来创建

+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context

喜欢:

Product *newProduct = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:context];

有关在代码中创建托管对象的更多信息,例如 here

【讨论】:

  • 我应该把最上面的代码行放在某个地方吗?
  • 不,这只是从 NSEntityDescription 文档中获取的定义,供您参考;我还添加了指向有关您的问题的文档的链接
  • 好的,我已经尝试了你的代码。这就是我所做的 **NSManagedObjectContext *context = [self managedObjectContext];项目 *currentProj = [[NSManagedObject alloc] initWithEntity:@"Project" insertIntoManagedObjectContext:context]; ** 出于某种原因,我收到了这些警告。不兼容的指针类型将“NSString *”发送到“NSEntityDescription *”类型的参数不兼容的指针类型使用“NSManagedObject *”类型的表达式初始化“Project *”
  • 对不起,我的错 - 复制和粘贴错误 - 请参阅更正的留置权以生成对象!之前的版本需要一个 NSEntityDescription 对象,而不仅仅是实体名称。
  • 好的,没有错误..我的最后一个问题是我是否能够从包含多个产品的数组中传递一个项目,比如这样说** newProduct = [tempFinishing objectAtIndex:i];* * 还是我必须采取其他方式?
【解决方案2】:

有几个问题:

currentProject = [[Project alloc] init];
currentProject = [tempFinishing objectAtIndex:i];

1) 您不能将项目创建为[[Project alloc] init];,但您必须使用

Project *newProject = [NSEntityDescription insertNewObjectForEntityForName:@"Project"
inManagedObjectContext:context];

2) 第二行 currentProject = [tempFinishing objectAtIndex:i]; 重写前一行“创建”的对象。

3) 您的所有代码(不是由 xCode 生成的)都必须在 Project 子类中。因为一旦您通过 xCode 重新生成 Projects 类,它将重写您的所有自定义代码。因此考虑使用mogenerator。

【讨论】:

    【解决方案3】:

    通过查看您的代码,我发现“项目”是 Core Data 的一个实体。 所以,在这段代码中,你不应该像你正在做的那样创建一个实体;

      for (int i = 0; i < [tempFinishing count]; i++) {
           currentProject = [[Project alloc] init];
           currentProject = [tempFinishing objectAtIndex:i];
    
           if ([currentProject.hasChange isEqualToString:@"T"]) {
           }
    }
    
    //Instead you should use the code like this:-
    
      for (int i = 0; i < [tempFinishing count]; i++) {
    
           //currentProject = [[Project alloc] init]; //Delete this line of code...
             currentProject = [tempFinishing objectAtIndex:i]; 
    
    //And, you should read an attribute/property value of an entity like this
    
            [currentProject valueForKey:@"hasChange"];
    //So, 
    
            if ([[currentProject valueForKey:@"hasChange"] isEqualToString:@"T"]) {
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      相关资源
      最近更新 更多