1

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 で必要です)。

4

1 に答える 1

0

まず、「グループ化」する場合は、取得した結果コントローラーsectionNameKeyPathを「barJidStr」に指定する必要があります。

次に、最大タイムスタンプ述語フォーマット文字列の正しい構文は です
@"ANY @max.timestamp"

第 3 に、SQL と属性名の間に不一致があります。属性が「barJidStr」として定義されている場合、生の SQL は「ZBAREJIDSTR」ではなく「ZBARJIDSTR」である必要があります。

于 2013-01-09T23:16:14.647 に答える