Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CoreData limit related entities batch size

I ran into a really simple CoreData issue but it seems hard to solve. Writing a simple chat app where every user has many messages.

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
}

The relationship is: one-to-many

Fetching user entity:

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;
}

How can I limit the related message entity (20 messages, sorted by date). The result array contains all the messages from this user.

Thx for helping.

like image 743
creality Avatar asked Dec 19 '25 04:12

creality


1 Answers

A fetch request always returns the objects from the managed object context. You cannot fetch "modified" objects, e.g. CoreUser objects with a "restricted" relationship to CoreMessage.

But what you can do instead is fetch the CoreMessage objects related to the given user:

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

and now you can add a fetch limit to restrict the number of retrieved messages:

fetchRequest.fetchLimit = 20

together with a suitable sort descriptor.

like image 129
Martin R Avatar answered Dec 20 '25 22:12

Martin R



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!