iOS-CoreData コンテキスト内で有効な NSPredicate を作成する際に問題が発生しています。テーブルには、すべての仲間のすべてのメッセージが含まれています。各仲間の最新のメッセージを取得する必要があります:
DBVisualizer を使用してみましたが、次の SQL が必要です (正常に動作します)。
/* for testing with a db tool like DbVisualizer
select ZBAREJIDSTR,ZBODY, ZTIMESTAMP
from ZXMPPMESSAGEARCHIVING_MESSAGE_COREDATAOBJECT
group by ZBAREJIDSTR
having max(ZTIMESTAMP)
order by ZTIMESTAMP desc;
*/
次のコードは「フォーマット文字列を解析できません」で失敗し、うまくいった例が見つかりませんでした。
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController == nil) {
NSManagedObjectContext *moc = [[Utilities chatManagerFromAppDelegate] managedObjectContext_messageArchiving];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject"
inManagedObjectContext:moc];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSAttributeDescription* bodyDesc = [entity.attributesByName objectForKey:@"body"];
NSAttributeDescription* barJidStrDesc = [entity.attributesByName objectForKey:@"barJidStr"];
NSAttributeDescription* timestampDesc = [entity.attributesByName objectForKey:@"timestamp"];
NSPredicate *predicateMaxTimestamp = [NSPredicate predicateWithFormat:@"@max.timestamp"];
NSSortDescriptor *sortDescriptorTimestampDesc = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptorTimestampDesc, nil];
[fetchRequest setEntity:entity];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:barJidStrDesc, bodyDesc, timestampDesc, nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObject:bodyDesc]];
[fetchRequest setHavingPredicate: predicateMaxTimestamp];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setFetchBatchSize:10];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:nil
cacheName:nil];
....
実際には、NSDictionaryResultType で動作しない基になるモデル ([fetchedResultsController setDelegate:self];) の更新が必要なため、他の代替手段もありがたいです (ただし、NSDictionaryResultType は group by で必要です)。