如何在IBAction中使用Core Data插入数据

时间:2012-05-02 09:44:46

标签: ios cocoa core-data

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

 - (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'例如消息是前向声明

有什么想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

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

如果您没有使用ARC,那么也会发生内存泄漏,因为您执行alloc / init并且没有释放。