0

テザーの最後に残っているコアデータに問題があります。ですから、素晴らしい人たちが助けてくれるのではないかと思いました。

基本的に、CoreDataプロジェクトには2つのエンティティがあります。これらは:

著者{authorName、dateOfBirth}
本{bookName、pages}

著者と本の間には「著者」と呼ばれる1対多の関係があり、「本」と呼ばれる逆の関係があります。これらのエンティティのサブクラスをエクスポートし、フェッチコントローラーを作成しました。プログラムで関係を定義する必要がありますか?

現在、著者のリストがテーブルビューに表示されています。現時点では、著者をタップした場合にのみ、CoreDataプロジェクト内のすべての書籍のリストを表示できます。特定の著者の本のリストにアクセスするにはどうすればよいですか?NSPredicateを使用すると思いますが、これまでのところ、そのロジックは次のとおりです。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY authors.bookName LIKE[cd] %@", authorName];

...しかし、それは間違いだと私は確信しています。

私は答えを求めて何時間もウェブをクロールしていて、混乱したままです。ですので、どんな助けでも大歓迎です。

どうもありがとう :)

4

2 に答える 2

0

メンバー変数「books」はAuthorクラスに存在し、NSManagedObjectレコードのNSSetを指します。これらはすべてBookオブジェクトになります。

明らかに、著者オブジェクトを取得できるので、著者オブジェクトを指定してその著者による本のリストを取得するには、次のようにします。

NSManagedObject *author = [self getSelectedAuthor];
NSSet *booksByAuthor = [author valueForKey:@"books"];
NSArray *booksArray = [booksByAuthor allObjects]; 

次に、NSArrayを使用してUITableViewにデータを入力できます。

XCodeには、CoreDataエンティティの管理対象オブジェクトクラスを自動的に作成する機能があります。xcdatamodelファイルを開き、エンティティの1つを選択してから、[ファイル]->[新規]を選択します。オプションとして管理対象クラスが表示されます。これにより、NSManagedObjectのサブクラスとしてAuthorクラスとBookクラスを作成できます。これらのクラスには、プロパティとして定義されたエンティティの各属性があります。つまり、上記のコードは次のようになります。

Author *author = [self getSelectedAuthor];
NSSet *booksByAuthor = author.books;
NSArray *booksArray = [booksByAuthor allObjects];
于 2010-08-01T21:15:46.133 に答える
0

次のようなものがある可能性があります。

@interface AuthorListController : UITableViewController {
    UITableView *table;
    NSArray *authors; // array of NSManagedObjects
}

@property (nonatomic, retain) IBOutlet UITableView *table;
@property (nonatomic, retain) NSArray *authors;

そして、あなたの実装には以下があります:

-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
    NSManagedObject *author = [authors objectAtIndex:indexPath.row];
    // create and show your book-level view here
}

選択した作成者オブジェクトを取得したので、(データモデラーで1対多の関係を設定したと仮定して)本を直接取得できます。

NSSet *books = author.books;

ただし、何らかの理由でauthorオブジェクトをロードしていない場合は、新しい検索を作成し、述語でbooks->authorsリレーションを使用できます。

NSManagedObjectContext *objectContext = self.managedObjectContext;
NSEntityDescription *entity = [NSEntity entityForName:@"Books" inManagedObjectContext:objectContext];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"author.name == %@", authorName];
[fetch setPredicate:predicate];

// ... create your error object and execute the fetch, etc
于 2010-08-01T22:59:03.770 に答える