2012-10-12 52 views
0

我想要获取所有相册的图片。我正在通过web服务获取此信息。 Web服务具有以下布局。NSFetchRequest不会回报任何东西

{ 

    "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; 
    } 

上面的代码给出了以下日志。 (我给了testcase 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] (
) 

希望有人能帮助我。

亲切的问候。

**这里你可以看到我的数据库模型

编辑

这里你可以看到我是如何得到我的照片,并把它放在我的数据库的screenshot

+ (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; 
} 

//上面的方法在我的第一个控制器中调用一个屏幕。有了这个循环,我填补了我的核心数据库。

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 
      } 
+0

这很奇怪,你从图片实体获取结果,但是使用谓词相册ID。我认为在谓词应该是:[NSPredicate predicateWithFormat:@“album.pic_album_id ==%@”,numberWithInt:AlbumId]]; – NeverBe

+0

对不起,我提供了错误的json数据。我编辑了我的代码。 – Steaphann

+0

你有没有Album实体?这个实体应该有图片一对多的关系。然后你可以得到所有picuture只是调用 - > NSArray *图片= [album.pictures allObjects]; – NeverBe

回答

0

使用谓词

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

UPDATE

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 
+0

感谢您的答复。但是当我将日志放入我的代码中时。它给了我“0结果”的日志。任何想法 ? – Steaphann

+0

我认为解析器有问题。你可以在这里附上解析器的代码吗? – NeverBe

+0

解析器是什么意思? – Steaphann

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表,并检查数据是否存在。 如果没有数据,那么程序逻辑有问题。

如果有数据并且看起来不错,请回到Xcode并为核心数据请求启用日志记录。编辑方案(产品编辑方案),选择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命令,返回丽雅并粘贴命令到Run Custom Command领域。将问号替换为

t0.zpic_album_id == ? 

与您要查看的album_id

查询的结果将是Core Data将检索的结果。

不知道whichAlbum会去哪里。只需回过头来找我们,让我们知道。