5

NSFetchRequest によって返される配列の NSLog の出力がわかりません。

データベースを読み取って内容を配列に配置し、配列をループしてから内容を NSLog で出力しています。ログファイルの出力がよくわかりません。以下のコード:

-(void)createXMLFeed{
    //Fetch details from the database.
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tabrss" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    NSError *error;
    self.stories = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    //[request release];

    // Count the number of items in the array and display in the log.
    int arrayItemQuantity = [stories count];
    NSLog(@"Array Quantity: %d", arrayItemQuantity);

    // Loop through the array and display the contents.
    int i;
    for (i = 0; i < arrayItemQuantity; i++)
        NSLog (@"Element %i = %@", i, [stories objectAtIndex: i]);

    [stories release]; 

    // Update log file.
    NSLog(@"Database read and XML feed created.");
}

ログ ファイルの内容:

2010-06-24 10:09:56.918 TAB RSS[998:207] Array Quantity: 15
2010-06-24 10:09:56.919 TAB RSS[998:207] Element 0 = <NSManagedObject: 0x3b3dcb0> (entity: Tabrss; id: 0x3b06a60 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p22> ; data: <fault>)
2010-06-24 10:09:56.920 TAB RSS[998:207] Element 1 = <NSManagedObject: 0x3b3e1c0> (entity: Tabrss; id: 0x3b14720 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p23> ; data: <fault>)
2010-06-24 10:09:56.920 TAB RSS[998:207] Element 2 = <NSManagedObject: 0x3b3e370> (entity: Tabrss; id: 0x3b1ebd0 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p24> ; data: <fault>)
2010-06-24 10:09:56.921 TAB RSS[998:207] Element 3 = <NSManagedObject: 0x3b3e4e0> (entity: Tabrss; id: 0x3b1ecd0 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p25> ; data: <fault>)
2010-06-24 10:09:56.921 TAB RSS[998:207] Element 4 = <NSManagedObject: 0x3b3e660> (entity: Tabrss; id: 0x3b3b3f0 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p26> ; data: <fault>)
2010-06-24 10:09:56.922 TAB RSS[998:207] Element 5 = <NSManagedObject: 0x3b3e7d0> (entity: Tabrss; id: 0x3b09d20 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p27> ; data: <fault>)
2010-06-24 10:09:56.922 TAB RSS[998:207] Element 6 = <NSManagedObject: 0x3b3e940> (entity: Tabrss; id: 0x3b3cf20 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p28> ; data: <fault>)
2010-06-24 10:09:56.924 TAB RSS[998:207] Element 7 = <NSManagedObject: 0x3b3eac0> (entity: Tabrss; id: 0x3b3cf30 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p29> ; data: <fault>)
2010-06-24 10:09:56.924 TAB RSS[998:207] Element 8 = <NSManagedObject: 0x3b3ec40> (entity: Tabrss; id: 0x3b3cf40 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p30> ; data: <fault>)
2010-06-24 10:09:56.925 TAB RSS[998:207] Element 9 = <NSManagedObject: 0x3b3edb0> (entity: Tabrss; id: 0x3b3cf50 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p31> ; data: <fault>)
2010-06-24 10:09:56.925 TAB RSS[998:207] Element 10 = <NSManagedObject: 0x3b3ef20> (entity: Tabrss; id: 0x3b3cf60 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p32> ; data: <fault>)
2010-06-24 10:09:56.926 TAB RSS[998:207] Element 11 = <NSManagedObject: 0x3b3f090> (entity: Tabrss; id: 0x3b3cf70 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p33> ; data: <fault>)
2010-06-24 10:09:56.926 TAB RSS[998:207] Element 12 = <NSManagedObject: 0x3b3f200> (entity: Tabrss; id: 0x3b3cf80 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p34> ; data: <fault>)
2010-06-24 10:09:56.927 TAB RSS[998:207] Element 13 = <NSManagedObject: 0x3b3f380> (entity: Tabrss; id: 0x3b3cf90 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p35> ; data: <fault>)
2010-06-24 10:09:56.927 TAB RSS[998:207] Element 14 = <NSManagedObject: 0x3b3f500> (entity: Tabrss; id: 0x3b3cfa0 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p36> ; data: <fault>)
(gdb) continue
2010-06-24 10:09:57.932 TAB RSS[998:207] Database read and XML feed created.

これは何を意味するのでしょうか?:

<NSManagedObject: 0x3b3dcb0> (entity: Tabrss; id: 0x3b06a60 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p22> ; data: <fault> 

データベースからフィールドの内容を実際に見たい。

データベースには 15 のレコードがあり、各レコードには 12 のフィールドがあります。私の基本的な理解から、私のstories配列は個々のフィールドではなく、データベースからのレコード全体を保持しているようです。これを達成するには 2D 配列が必要かもしれません。

最終的には、配列をループ処理して、各フィールドの XML タグを作成したいと考えています。でも一歩ずつ…

前もってありがとう、スティーブン

4

2 に答える 2

14

表示されている出力はdescription、NSManagedObjectクラスのメソッドからのものです。これは、軽量のデバッグを目的とした、人間が読める形式の出力です。実際にデータを解析または保存するために使用することは想定されていません。

管理対象オブジェクトは「障害」としてフェッチされたため、説明ダンプにデータの詳細は表示されません。これは、それらが単なるオブジェクトのゴーストであり、実際のデータが含まれていないことを意味します。本格的なオブジェクトをすぐにフェッチするには、フェッチリクエストを次のように設定します。

[request setReturnsObjectsAsFaults:NO];

...次に、オブジェクトをログに記録すると、それらのデータと関係が表示されます。

属性のデータを実際に使用するには、などの値メソッドの1つを使用して属性を直接クエリする必要がありますvalueForKey:@"attributeName"

編集:

あなたの質問を編集した後、私は詳しく説明する必要があると思います。

あなたはコアデータについてすべて間違っていると考えています。CoreDataはデータベースではありません。フィールドはありません。フェッチ要求の戻りはテーブルではありません。

Core Dataのリレーショナルデータベース要素は完全にオプションであり、非表示になっています。代わりに、CoreDataはオブジェクト間の関係の整合性を維持するオブジェクトグラフマネージャーです。データはオブジェクトに格納され、永続ストアからフェッチすると、フィールド、列、または行ではなく、オブジェクトが返されます。

この場合、フェッチはTabrss、エンティティグラフでエンティティを表すように構成された汎用NSManagedObjectを返します。各管理対象オブジェクトインスタンスは、1つの論理Tabrssオブジェクトを表します。任意のオブジェクトから任意の値を取得するには、エンティティTabrssの属性の名前に関連付けられた値を管理対象オブジェクトに要求します。Tabrss

エンティティTabrssname属性があるとします。フェッチ内のすべての名前を取得するにはTabrss、次を使用します。

int i;
for (i = 0; i < arrayItemQuantity; i++)
    NSLog (@"Element %i = %@", i, [[stories objectAtIndex: i] valueForKey:@"name"]);

またはそれをより明確にする:

NSManagedObject *aTabrss;
for (aTabrss in stories)
    NSLog(@"aTabrss.name=%@",[aTabrss valueForKey:@"name"]);

エンティティのカスタムNSManagedObjectサブクラスを作成する場合はTabrss、ドット表記を使用して属性を直接クエリできます。

TabrssSubclass *aTabrss;
for (aTabrss in stories)
    NSLog(@"ATabrss.name=%@",aTabrss.name]);

覚えておくべき重要なことは、配列、行列、テーブル、その他のダムデータ構造ではなく、本格的なオブジェクトを扱っていることです。属性の1つの値を尋ねるメッセージを送信することにより、個々のオブジェクトからデータを取得します。

于 2010-06-26T17:09:59.313 に答える
6

配列内のオブジェクトの個々のフィールドを表示するには、それらを直接参照する必要があります。これを使用して、配列内のオブジェクトを表示しています。

NSLog (@"Element %i = %@", i, [stories objectAtIndex: i]);

%@ を使用すると、NSLog は各オブジェクトの説明を生成しますが、これは複雑で役に立たないことがよくあります。内部のフィールドを見たい場合は、次のようにしてみてください。

NSLog (@"Element %i contains fields: %d - %s - %d",i,[[stories objectAtIndex: i] getIntegerField],[[stories objectAtIndex: i] getStringField],[[stories objectAtIndex: i] getAnotherIntegerField]);

表示される値は、ストーリーで参照している各オブジェクトのゲッター関数によって返される値です。

于 2010-06-24T13:51:44.580 に答える