从核心数据中获取不同的数据以及降序?

Posted

技术标签:

【中文标题】从核心数据中获取不同的数据以及降序?【英文标题】:Fetch distinct data from Core data alongwith descending order? 【发布时间】:2013-09-28 13:34:17 【问题描述】:

我创建了聊天应用程序,其中我将数据保存在核心数据中。我使用以下实体,

我想获取所有唯一customerno 的数据,并且该数据将按messagedate 的降序排列,还包含从其他cmid 发送的最新messagetext。我想显示列表像 facebook 聊天消息列表和微笑视图。 我尝试以下代码,

-(NSArray *)getAllInstanceMessages
    NSError *error = nil;
    NSFetchRequest * req = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"IMDetails" inManagedObjectContext:theManageContext];
    [req setPredicate:[NSPredicate predicateWithFormat:@"cmid=%@", theCmID]];
    NSDictionary *entityProperties = [entity propertiesByName];
    [req setEntity:entity];
    [req setReturnsDistinctResults:YES];
    [req setResultType:NSDictionaryResultType];
    [req setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"customerno"]]];
    [req setSortDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"messagedate" ascending:NO]]];
    NSArray *result = [theManageContext executeFetchRequest:req error:&error];

    if(error)
        NSLog(@"%s, %@", __FUNCTION__, [error localizedDescription]);
        return nil;
    
    return result;

上面的代码给出了我的以下输出,

Printing description of result:
<_PFArray 0xa3cda70>(

    customerno = CN00001;
    customerno = CN00002;
    customerno = CN00003;

)

我想要完整的数据以及这个唯一的数字,我的意思是包含唯一数据的字典/ManagedObject 数组,假设在上面的 CN0001 数字中,但它不包含其他属性值。

我在代码中做错了什么?

【问题讨论】:

【参考方案1】:

根据 setPropertiesToFetch 方法的 NSFetchRequest 类参考文档:“此值仅在 resultType 设置为 NSDictionaryResultType 时使用。”

【讨论】:

【参考方案2】:

您需要在 setPropertiesToFetch 中设置您想要获取的表的所有属性。喜欢

[req setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"customerno"],[entityProperties objectForKey:@"messagetext"],nil]];

这将返回具有两个值的 NSDictionary。

【讨论】:

你的建议我在问这个问题之前就试过了。上述行不影响唯一性。你的消息很少是唯一的,所以上面的行给了我同一病人的所有数据的结果,我不会那样做。 以上结果我使用这个 [req setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"customerno"], [entityProperties objectForKey:@"messagetext"],nil]]; 在看到结果集后,一件事是清除您的表格包含所有 messageText 数据。 是的。那是我不想要的。我想要拥有最新消息记录的唯一客户。 在那种情况下,有解决方案1:在表中应用规范化或制作两个获取语句,首先获取所有唯一用户,然后按messageDate顺序获取消息文本。

以上是关于从核心数据中获取不同的数据以及降序?的主要内容,如果未能解决你的问题,请参考以下文章

从同一个核心数据数据库中获取多个不同的实体

从不同核心数据实体获取数据并将结果转换为相应类的通用方法

核心数据获取请求不返回不同的结果

核心数据:获取属性的最低值

从众多实体中恢复一个获取的实体——核心数据

iOS:核心数据获取