NSFetchRequest 不返回任何东西
Posted
技术标签:
【中文标题】NSFetchRequest 不返回任何东西【英文标题】:NSFetchRequest doesn't give back anything 【发布时间】:2012-10-12 12:59:02 【问题描述】:我正在尝试获取相册的所有图片。我通过网络服务得到这个。 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] (
)
希望有人可以帮助我。
亲切的问候。
** 在这里你可以看到我的数据库模型的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
【问题讨论】:
很奇怪,你是从图片实体中获取结果,但在谓词专辑ID中使用。我认为谓词应该是:[NSPredicate predicateWithFormat:@"album.pic_album_id == %@", numberWithInt:AlbumId]]; 很抱歉我提供了错误的 json 数据。我已经编辑了我的代码。 你有相册实体吗?这个实体应该有图片一对多的关系。然后你可以得到所有的图片只需调用 -> NSArray *pictures = [album.pictures allObjects]; 将数据导入到 NSManagedObject 子类的位置在哪里?当您使用核心数据进行搜索时,JSON 是什么并不重要。发布您的NSManagedObjectModel
的屏幕截图。在这个开发阶段,您始终可以使用免费应用程序检查 SQL 数据库的内容,甚至可以使用 XML 持久存储。
您所有的图片都说它们的相册 ID 为“1”,因此没有得到“3”的结果可能是正确的(如果您的数据样本准确)。
【参考方案1】:
使用谓词
[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
【讨论】:
感谢您的回答。但是当我将日志放入我的代码中时。它给了我“0个结果”的日志。有什么想法吗? 我认为解析器有问题。你能在这里附上解析器的代码吗? 解析器是什么意思? 它只是解析器的一部分。我想看看你是如何处理完整的 json 文件的。 当我再次查看时,我发现它总是给我返回相同的结果?有什么想法吗?【参考方案2】:如何排除故障:
获取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 并为核心数据请求启用日志记录。编辑方案(产品 - 编辑方案),选择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
会去哪里。只需返回您的发现并告诉我们。
【讨论】:
以上是关于NSFetchRequest 不返回任何东西的主要内容,如果未能解决你的问题,请参考以下文章
NSFetchRequest 在第一次运行时返回对象,但以后不返回