私は Apple Developer ガイドとチュートリアルを読み、Core Data に関する 2 冊の iPhone の本を読みました。
私は物事の「値オブジェクト」/「エンティティ」側を処理し、それらを Web サービスなどに送信することに慣れています。しかし、iPhone ではすべてを自分で処理できます… 残酷な世界です :)
、およびApple Developer サイトの例ではLocations
、「計算」できる方法で答えが得られません。ここの誰かが私を啓発してくれることを願っています。TaggedLocations
PhotoLocations
データモデル GUI を使用してモデルをセットアップしました。2 つのエンティティ、Person
およびDream
.
文字列属性と 1 対多の関係
Person
があります。文字列属性と 1 対 1 の関係があります。personName
dreams
Dreams
description
person
tableView
私は簡単なアプリをセットアップしています。最初のビューは人のリストで、2 番目のビューは彼らの夢のリストです。
これは私が人をに追加する方法ですmodelObjectContext
:
Person *newPerson = (Person *)[NSEntityDescription
insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:managedObjectContext];
[newPerson setPersonName:@"Ben Hur"];
OK、次にコンテキストに新しい夢を追加します。
Dream *newDream = (Dream *)[NSEntityDescription
insertNewObjectForEntityForName:@"Dream"
inManagedObjectContext:managedObjectContext];
[newDream setDescription:@"I had a nightmare"];
私は今、このような人に夢を追加します:
[newPerson addDreamObject:newDream];
Person
ここでは、クラスで xcode がさまざまなメソッド/アクセサーを生成したため、少しぼんやりしています。
@class Dream;
@interface Person : NSManagedObject
{
}
@property (nonatomic, retain) NSString * personName;
@property (nonatomic, retain) NSSet* dream;
@end
@interface Person (CoreDataGeneratedAccessors)
- (void)addDreamObject:(Dream *)value;
- (void)removeDreamObject:(Dream *)value;
- (void)addDream:(NSSet *)value;
- (void)removeDream:(NSSet *)value;
@end
他の状況では、実際の保存、取得、データを処理する必要はありませんでした。私はエンティティ/値オブジェクトを作成し、夢を保存するためにperson
それを与えました。Array
しかし、これはコアデータで可能な属性タイプではなく、それを行う方法でもありません.
では、このボイラープレート コードはどのように機能するのでしょうか。を使って夢いっぱいaddDream
送っていいのかな?または、コアデータを信頼してこれをインスタンス化し、タイプのエンティティオブジェクトを送信するNSSet
だけを使用できますか?addDreamObject
Person
Dreams
また、xcode のボイラープレート コードを使用してコンテキストを保存します。ここで、ビューをこの人物、より正確には彼の名前で更新したいと思います。
メソッドでは、次のcellForRowAtIndexPath
ように指定します。
NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [[managedObject valueForKey:@"personName"] description];
再びすべてがうまくいき、名前がリストに表示されます。
オブジェクトをパラメーターとしてDreamViewController
受け取るように設定しました。Person
Person *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
dreamView.selectedPerson = selectedObject;
viewController
次に、 をスタックにプッシュし、に入りますDreamView
。ここでは、私が「一緒に送った」人に関連する夢を見ることができないようです。
これは私がDreamViewController
'sviewDidLoad
メソッドで試していることです (オブジェクトselectedPerson
を渡すために使用するアクセサーです):Person
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"One Person";
NSManagedObjectContext *context = selectedPerson.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Dream"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// Handle the error.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
NSMutableArray *mutableArray = [fetchedObjects mutableCopy];
self.dreamArray = mutableArray;
NSLog(@"the length of dreamArray: %i",[self.dreamArray count] );
Dream *d = [dreamArray objectAtIndex:0];
NSLog(@"The Dream object says: %@", [d description]);
[mutableArray release];
[fetchRequest release];
}
私は本当にこれを理解することができないようです.Objective Cでの私の現在の経験では、Appleのドキュメントの行間から「ベストプラクティス」の本質をつかむことはできません.