gpt4 book ai didi

iphone - 核心数据关系 : How to insert a new object into an entity and create a relationship to an existing object in another entity

转载 作者:技术小花猫 更新时间:2023-10-29 10:50:00 25 4
gpt4 key购买 nike

我正在构建一个小的 iPhone 应用程序,它允许用户记录他们可能与 friend 一起玩的游戏的分数。我现在需要在 Core Data 中使用关系,但似乎无法正常工作。

我希望能够将新数据添加到一个实体中,同时在另一个实体中创建与现有数据的关系。我怎样才能做到这一点?

请注意,我是 Core Data 的新手,今天大部分时间都在尝试解决这个问题,但运气不好。非常感谢任何帮助。


我有 3 个实体:ScoresGamesPlayers

Scores 属性:dateplayer1Scoreplayer2Scorestatus

游戏 属性:title

Players 属性:name

我在 (Scores <<--->> Games) 和 (Scores <<--->> 玩家)


我已经有了游戏和玩家的列表。用户选择哪个游戏和谁在玩,并使用此信息在 Scores 实体中创建一组对象,这些对象与所选游戏和玩家有关系。

这是我的来源:

//  Scores.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Games, Players;

@interface Scores : NSManagedObject

@property (nonatomic, retain) NSDate * date;
@property (nonatomic, retain) NSNumber * player1Score;
@property (nonatomic, retain) NSNumber * player2Score;
@property (nonatomic, retain) NSNumber * status;
@property (nonatomic, retain) NSSet *game;
@property (nonatomic, retain) NSSet *player;
@end

@interface Scores (CoreDataGeneratedAccessors)

- (void)addGameObject:(Games *)value;
- (void)removeGameObject:(Games *)value;
- (void)addGame:(NSSet *)values;
- (void)removeGame:(NSSet *)values;

- (void)addPlayerObject:(Players *)value;
- (void)removePlayerObject:(Players *)value;
- (void)addPlayer:(NSSet *)values;
- (void)removePlayer:(NSSet *)values;

@end

// SC_ScoreViewController.h

#import <UIKit/UIKit.h>

@interface SC_ScoreViewController : UIViewController

@property (strong) NSIndexPath *game;
@property (strong) NSIndexPath *playerOne;
@property (strong) NSIndexPath *playerTwo;

@property (weak, nonatomic) IBOutlet UILabel *playerOneName;
@property (weak, nonatomic) IBOutlet UILabel *playerTwoName;

@end

//  SC_ScoreViewController.m

#import "SC_ScoreViewController.h"
#import "Scores.h"
#import "Players.h"
#import "Games.h"

@interface SC_ScoreViewController ()

@end

@implementation SC_ScoreViewController

@synthesize game;
@synthesize playerOne;
@synthesize playerTwo;

// managedObjectContext (context)
- (NSManagedObjectContext *)managedObjectContext {
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate respondsToSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];

// Setup Nav Title
self.navigationItem.title = [self.game valueForKey:@"title"];

// Setup Player's Names
[self.playerOneName setText:[self.playerOne valueForKey:@"name"]];
[self.playerTwoName setText:[self.playerTwo valueForKey:@"name"]];


Scores * newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Scores" inManagedObjectContext:self.managedObjectContext];
newEntry.player1Score = 0;
newEntry.player2Score = 0;
newEntry.status = nil;
newEntry.player = self.playerOne; // Incompatible pointer types assigning to NSSet from NSIndexPath

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

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

我希望我已经说清楚并提供了足够的信息。这是我的第一个问题,希望一切顺利。任何帮助都会很棒,谢谢。

最佳答案

您必须将 Players 对象插入到 self.managedObjectContext 中,就像插入新的 Score 对象一样。它可能是这样的:

Scores *score = [NSEntityDescription insertNewObjectForEntityForName:@"Scores" inManagedObjectContext:self.managedObjectContext];
Player *player = [NSEntityDescription insertNewObjectForEntityForName:@"Player" inManagedObjectContext:self.managedObjectContext];
[score addPlayerObject:player];

您还必须更改要排序的关系“Scores <<--->> Players”,因为现在您不知道哪个玩家是哪个。这里的其他选择是使用两个多对一关系(分别用于 player1 和 player2)。

还有一件事:以单数形式命名您的实体是最佳实践,因此 Score 而不是 Scores 等等。

你应该阅读 Creating Managed Object Relationships .里面的描述都很好。

更新:我认为 Games 和 Scores 之间不应该存在多对多关系(据我了解,Score 可以重命名为 Match)。应该是一对多的关系吧。

关于iphone - 核心数据关系 : How to insert a new object into an entity and create a relationship to an existing object in another entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19303062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com