CoreData限制相关实体批量大小

cre*_*ity 2 sqlite core-data ios swift

我遇到了一个非常简单的CoreData问题,但似乎很难解决.编写一个简单的聊天应用,每个用户都有很多消息.

class CoreUser: NSManagedObject
{
    @NSManaged var firstname: String?
    @NSManaged var id: String?
    @NSManaged var lastname: String?
    @NSManaged var nickname: String?
    @NSManaged var messages: NSSet
}

class CoreMessage: NSManagedObject
{
    @NSManaged var body: String?
    @NSManaged var owner: CoreUser
    @NSManaged var state: String
    @NSManaged var timestamp: NSDate
}
Run Code Online (Sandbox Code Playgroud)

关系是:一对多

获取用户实体:

func getCoreUser(userId: String) -> CoreUser?
{
    var error: NSError?;
    let fetchRequest = NSFetchRequest(entityName: "CoreUser");
    let nodeId = NSString(string: userId.lowercaseString);
    let pred = NSPredicate(format: "id == %@", nodeId);
    fetchRequest.fetchLimit = 1;
    fetchRequest.predicate = pred;
    let fetchResults = self.managedObjectContext!.executeFetchRequest(fetchRequest, error: &error) as? [CoreUser];

    if let results = fetchResults
    {
        return results.first;
    }
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

如何限制相关消息实体(20条消息,按日期排序).结果数组包含来自此用户的所有消息.

谢谢你的帮助.

Mar*_*n R 7

获取请求始终从托管对象上下文返回对象.您无法获取"已修改"的对象,例如 CoreUser与"受限制"关系的对象CoreMessage.

但是你可以做的是获取CoreMessage与给定用户相关的对象:

let fetchRequest = NSFetchRequest(entityName: "CoreMessage")
fetchRequest.predicate = NSPredicate(format: "owner.id == %@", nodeId)
Run Code Online (Sandbox Code Playgroud)

现在,您可以添加提取限制以限制检索到的消息数:

fetchRequest.fetchLimit = 20
Run Code Online (Sandbox Code Playgroud)

以及合适的排序描述符.