0

アルバムのすべての写真を取得しようとしています。私はこれをWebサービスで取得しています。Web サービスのレイアウトは次のとおりです。

{

    "name": "Club Brugge - KRC Genk",
    "date": "08.10.2012",
    "albumId: 1,
    "pictures": [
        {
            "pic_album_id"=1,
            "pic_id" = 1,
            "url": "http://www.krcgenk.be/images/gallery/album_199/800X600/1a06dc0e405fd0219e3d327f1eec7fbf.jpg"
        },
        {
            "pic_album_id"=1,
            "pic_id" = 2,
            "url": "http://www.krcgenk.be/images/gallery/album_199/800X600/e8e10c0664eb0533a0534ed69891b165.jpg"
        },
        {
            "pic_album_id"=1,
            "pic_id"= 3,
            "url": "http://www.krcgenk.be/images/gallery/album_199/800X600/750b55a87b8eae33b8f3278add9bec44.jpg"
        }
]

特定のアルバムのすべての写真を取得するには、次の関数があります。

 - (NSMutableArray *)getAllPicturesOfAlbumId: (int)AlbumId
    {
        NSString *picture_Url = [[NSString alloc]init];
        NSArray *results = [[NSArray alloc]init];
        _picturesForAlbum = [[NSMutableArray alloc]init];

        picture_Url = @"";
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pic_album_id == %@",
                                  [NSNumber numberWithInt:AlbumId]];
        NSLog(@"album id: %@",[NSNumber numberWithInt:AlbumId]);
        [request setEntity:[NSEntityDescription entityForName:@"Picture" inManagedObjectContext:self.genkDatabase.managedObjectContext]];
        [request setPredicate:predicate];
        NSError *error = nil;
        results = [self.genkDatabase.managedObjectContext executeFetchRequest:request error:&error];
        NSLog(@"results: %@",results);
        if (results == nil) {
            NSLog(@"nil results");
            // handle errors
        } else if (results.count == 0) {
            NSLog(@"0 results");
// nothing found
        } else {
            for(int i = 0; i < results.count ; i++){
            Picture *picture = [results objectAtIndex:i];
                NSLog(@"%@",[results objectAtIndex:i]);
                [_picturesForAlbum addObject:picture];
            }
        }
        NSLog(@"%@",_picturesForAlbum);
        //NSLog(@"album: %@",[_picturesForAlbum objectAtIndex:5]);
        return _picturesForAlbum;
    }

上記のコードは、次のログを提供します。(私はテストケースAlbumId = 3にそれを与えました)

2012-10-12 14:53:04.577 RacingGenk[4793:c07] album id: 3
2012-10-12 14:53:04.578 RacingGenk[4793:c07] results: (
)
2012-10-12 14:53:04.578 RacingGenk[4793:c07] (
)

誰かが私を助けてくれることを願っています。

敬具。

** ここに私のデータベース モデルのスクリーンショットが表示されます

編集

ここでは、写真を取得してデータベースに入れる方法を示します。

+ (Picture *)pictureWithGenkInfo:(NSDictionary *)genkInfo
          inManagedObjectContext:(NSManagedObjectContext *)context
                     withAlbumId:(int)albumId
                   withPictureId:(int)pictureId;
{

    Picture *picture = nil;

    picture = [NSEntityDescription insertNewObjectForEntityForName:@"Picture"
                                          inManagedObjectContext:context];
    picture.url                     = [genkInfo objectForKey:PICTURES_URL];
    picture.pic_album_id            = [NSNumber numberWithInt:albumId];
    picture.picture_id              = [NSNumber numberWithInt:pictureId];


    return picture;
}

//上記のメソッドは、1 つの画面に表示される最初のコントローラーで呼び出されます。このループで、コア データベースがいっぱいになります。

 for (NSDictionary *genkInfo in albums ) {
                albumId++;
                [Album albumWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withAlbumId:albumId];
                 for (NSDictionary *genkInfo2 in pictures ) {
                     pictureId++;
                     [Picture pictureWithGenkInfo:genkInfo2 inManagedObjectContext:document.managedObjectContext withAlbumId:albumId withPictureId:pictureId];
                 }
               pictureId = 0;
                // table will automatically update due to NSFetchedResultsController's observing of the NSMOC
            }
4

2 に答える 2

0

トラブルシューティング方法:

Liyaまたは別の sqlite データベース ビューアーを入手してください。コア データ データベースのあるフォルダーに移動します。シミュレーターで

/Users/<username>/Library/Application Support/iPhone Simulator/<version of iOS>/Applications/<long cryptig string>/<folder-with-the-core-data-database>

sqliteデータベースを開き、ZPictureテーブルに移動して、データが存在することを確認します。データがない場合は、webservice->core-dataプログラム ロジックに問題があります。

データがあり、問題がないように見える場合は、Xcode に戻り、core-data リクエストのログを有効にします。スキームを編集し (製品 - スキームの編集)、Run, Debugスキームを選択してタブを に変更しますArguments。フィールドArguments Passed On Launchに を追加し-com.apple.CoreData.SQLDebug 3ます。チェックボックスがオンになっていることを確認します。

アプリを実行すると、デバッガー コンソール ウィンドウに、core-data によって生成された SQL コードが表示されます。

次のようなものが表示されます: (whichAlbum表示される場合があります)

<timestamp> CoreData: annotation: fetch using NSSQLiteStatement <0xfxxxxxx> on entity
'Picture' with sql text 'SELECT 0, t0.Z_PK, t0.Z_OPT, t0.zpic_album_id 
FROM zpicture t0 WHERE t0.zpic_album_id == ?'
<timestamp> CoreData: details: SQLite bind[0] = (int64)3

sql コマンドを取得し、Liya に戻り、コマンドをRun Custom Commandフィールドに貼り付けます。の疑問符を置き換えます

   t0.zpic_album_id == ?

album_idあなたが見たいと。

クエリの結果は、Core Data が取得するものになります。

whichAlbumどこに行くのかわかりません。見つけたものを持って戻ってきて、私たちに知らせてください。

于 2012-10-14T09:36:46.773 に答える
0

述語を使用

 [NSPredicate predicateWithFormat:@"whichAlbum.album_id == %d", AlbumId];

アップデート

 for (NSDictionary *genkInfo in albums ) {
      albumId++;
      Album *album = [Album albumWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withAlbumId:albumId];
      for (NSDictionary *genkInfo2 in pictures ) {
          pictureId++;
          Picture *pic = [Picture pictureWithGenkInfo:genkInfo2 inManagedObjectContext:document.managedObjectContext withAlbumId:albumId withPictureId:pictureId];
          [album addPictureObject:pic]; // this method should be automatically generated
       }
       pictureId = 0;
 // table will automatically update due to NSFetchedResultsController's observing of the NSMOC
        }

// don't forget save context
于 2012-10-12T21:42:26.487 に答える