12

私は、ユーザーが友達とプレイしているゲームのスコアを記録できる小さな iPhone アプリを作成しています。Core Data でリレーションシップを使用する必要がありますが、うまく機能していないようです。

別のエンティティの既存のデータへの関係を作成しながら、新しいデータを 1 つのエンティティに追加できるようにしたいと考えています。どうすればこれを達成できますか?

私は Core Data を初めて使用し、これを理解するために今日の大部分を費やしましたが、運が尽きたことに注意してください。どんな助けでも大歓迎です。


ScoresGamesPlayersの3 つのエンティティがあります。

スコアの属性: dateplayer1Scoreplayer2Scoreおよびstatus

ゲームの属性: title.

プレーヤーの属性: name.

( Scores <<--->> Games ) と ( Scores <<--->> Players )の間に多対多の関係があります


私はすでにゲームとプレーヤーの両方のリストを持っています。ユーザーは、どのゲームと誰がプレイしているかを選択します。この情報を使用して、選択したゲームとプレイヤーとの関係を持つ一連のオブジェクトが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

私は明確であり、十分な情報を提供したことを願っています. これは私の最初の質問なので、すべてが順調であることを願っています。どんな助けでも素晴らしいでしょう、ありがとう。

4

3 に答える 3

9

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" を順序付けするように変更する必要があります。これは、現時点ではどのプレーヤーがどちらであるかがわからないためです。ここでの他のオプションは、2 つの多対 1 の関係を使用することです (player1 と player2 に対して別々に)。

もう 1 つ: エンティティに単数形の名前を付けるのがベスト プラクティスScoreですScores

管理対象オブジェクトの関係の作成を読む必要があります。そこにはすべてうまく説明されています。

更新:ゲームとスコアの間に多対多の関係があってはならないと思います (私が理解していることから、Score は Match に名前を変更できます)。おそらく、1 対多の関係である必要があります。

于 2013-10-10T18:17:30.950 に答える