0

我想创建一个按钮,即“完成”,按下时,将所有数据保存到核心数据中,我正在使用下面的代码

 - (IBAction)done:(id)sender
{
    Player *player = [[Player alloc] init];
    player.name = self.nameTextField.text;
    player.game = game;
    player.rating = 1;

    [self.delegate playerDetailsViewController:self didAddPlayer:player];

    NSManagedObjectContext *context = [self managedObjectContext];
    Player *player = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"Player"
                                      inManagedObjectContext:context];
    player.name = self.nameTextField.text;
    player.game = game;
    player.rating = 1;

    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }

}

但我不断收到错误,例如:

语义问题:使用未声明的标识符“NSEntityDescription”;你的意思是“kSecAttrDescription”吗?

实例消息的接收器类型“PlayerDetailsViewController”未声明具有选择器“managedObjectContext”的方法

重新定义“玩家”

使用未声明的标识符“NSEntityDescription”;你的意思是“kSecAttrDescription”吗?

错误的接收器类型“CFTypeRef”(又名“const void *”)

例如消息的接收器类型“NSManagedObjectContext”是前向声明

有任何想法吗?

4

2 回答 2

2

确保你有

#import <CoreData/CoreData.h>

在您的标题中的某个位置,直接在您的文件中或在您的应用程序的 pch 文件中。当您创建 Core Data 项目时,它应该默认存在,但如果您稍后添加 Core Data,它可能会丢失。下面是一个核心数据项目的 pch 的样子:

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import <CoreData/CoreData.h>
#endif
于 2012-06-08T09:24:20.223 回答
0

您使用相同的变量名称定义 Player 两次:

Player *player = [[Player alloc] init];

Player *player = [NSEntityDescription insertNewObjectForEntityForName:@"Player" inManagedObjectContext:context];

第二个应该有不同的变量名。此外,您不应该通过 alloc/init 分配 CoreData 对象。此外,使用 NSEntityDescription 创建的播放器调用 didAddPlayer。最好的地方是保存后:因为只有在那里你确定它被正确保存了。

如果您没有使用 ARC,也会有内存泄漏,就像您使用 alloc/init 一样,并且没有释放。

于 2012-05-02T13:45:39.023 回答