0

CoreDataModel で動作する Mac OSX 用のドキュメント アプリケーションを作成しました。

ボタンがクリックされたときに、コアデータに値をプログラムで保存しようとしています。

アプリの起動時に値を保存できます。

- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
[super windowControllerDidLoadNib:aController];

NSManagedObjcetContext *moc = [self managedObjectContext];
NSSet *session = [moc fetchObjectsForEntityName:@"Sessions" withPredicate:nil];
NSLog(@"%d", (int)[session count]);
NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Sessions"
                                                     inManagedObjectContext:moc];
[obj setValue:@"TEST" forKey:@"name"];
[obj setValue:[NSDate dateWithTimeIntervalSinceReferenceDate:112700] forKey:@"start"];
[obj setValue:[NSDate dateWithTimeIntervalSinceReferenceDate:118700] forKey:@"stop"];
}

しかし、カウンターの値を NSObject 内に保存したいと考えています。そこで先ほどの値渡しのように PersistentDocument に関数を作ってみたのですが、coredata 要素の数が 0 で、正しい Entity を参照していないと思います。

誰かがそれを行う方法やこれがどのように機能するかを説明できますか?

ありがとうエール

編集:

もっと明確にしようと思います。

START ボタンと STOP ボタンを備えたクロノ カウンターがあります。別のボタン SAVE を使用して、停止したときにタイマーの値をコアデータに保存したいと思います。カウンタの管理は NSObject CounterObject にあります。

どうすればいいですか?これで、windowControllerDidLoadNib の関数を呼び出す PersistentDocument からのみコア データを書き込むことができるようになりました。coredata にカウンター値を書き込む関数を呼び出したいのですが、CounterObject から PersistentDocument で関数を呼び出すと、挿入したログに 4 ではなく 0 要素が表示されるため、正しく渡されません。

コードは次のとおりです。

// Document
#import "Document.h"
#import "NSManagedObjectContext.h"

@implementation Document

- (id)init
{
self = [super init];
if (self) {

}
return self;
}

- (NSString *)windowNibName
{
// Override returning the nib file name of the document
// If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.
return @"Document";
}

- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
[super windowControllerDidLoadNib:aController];
[self saveTimeMOC:[NSDate dateWithString:@"11:23:34"]];
}

-(IBAction)saveTimeMOC:(NSDate *)time {

NSManagedObjectContext *moc = [self managedObjectContext];
NSSet *session = [moc fetchObjectsForEntityName:@"Sessions" withPredicate:nil];
NSLog(@"%d", (int)[session count]);
NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Sessions"
                                                     inManagedObjectContext:moc];
[obj setValue:@"TEST" forKey:@"name"];
[obj setValue:time forKey:@"start"];
[obj setValue:[NSDate dateWithTimeIntervalSinceReferenceDate:118700] forKey:@"stop"];

}

+ (BOOL)autosavesInPlace
{
return YES;
}

@end

// CounterObject
#import "CounterObject.h"
#import "Document.h"

@implementation CounterObject

@synthesize contText, startButton, stopButton;

-(id)init {
self = [super init];
if (self) {

}
return self;
}

- (IBAction)startContatore:(id)sender {
stopButton.title = @"Stop";
[stopButton setEnabled:YES];
[startButton setEnabled:NO];
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(gestioneTimer) userInfo:nil repeats:YES];
}

- (IBAction)stopContatore:(id)sender {
if (timer != nil) {
    [timer invalidate];
    timer = nil;
}
if (stopButton.title != @"Reset") {
    [startButton setEnabled:YES];
    stopButton.title = @"Reset";
    startButton.title = @"Continue";
} else if (stopButton.title == @"Reset") {
    stopButton.title = @"Stop";
    [stopButton setEnabled:NO];
    startButton.title = @"Start";
    timerCont = 0;
    contText.stringValue = [NSString stringWithFormat:@"00:00"];
}
}

- (void)gestioneTimer {
timerCont += 1;

int minutes = floor(timerCont/60);
int seconds = trunc(timerCont - minutes * 60);

contText.stringValue = [NSString stringWithFormat:@"%02i:%02i", minutes, seconds];
}

- (IBAction)saveTime:(id)sender {
Document *moc = [[Document alloc] init];
[moc saveTimeMOC:[NSDate dateWithString:@"13:45:22"]];
}
4

1 に答える 1

1

オブジェクトをコア データに追加する場合は、次のようにします。

- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
[super windowControllerDidLoadNib:aController];

NSManagedObjcetContext *moc = [self managedObjectContext];   
// But be sure that [self managedObjectContext] is the correct one; you can do this to see if   //it's not a null value : NSLog(@"%@",[self managedObjectContext]);

NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Sessions"
                                                     inManagedObjectContext:moc];
[obj setValue:@"TEST" forKey:@"name"];
[obj setValue:[NSDate dateWithTimeIntervalSinceReferenceDate:112700] forKey:@"start"];
[obj setValue:[NSDate dateWithTimeIntervalSinceReferenceDate:118700] forKey:@"stop"];
}

Core Data のリクエストは次のとおりです。

-(voi)testRequestCoreData {
NSError *error =nil;
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init]autorelease];
NSEntityDescription *entity = [NSEntityDescription
    entityForName:@"Sessions" inManagedObjectContext:moc];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
....
}
于 2012-05-19T11:20:36.147 に答える