3

I'm trying to create a method for querying a table in Realm with the option for excluding certain rows (by their IDs). Since Realm doesn't support multiple equal parameters similar to its findAllSorted(String[], boolean[]) method, I'm performing it in a loop.

Is there a better way to do this job?

public static RealmResults<MessageItem> getAll(long threadId, Collection<Long> excludedMessageIds) {

        final Realm realm = Realm.getDefaultInstance();
        RealmQuery<MessageItem> allMessagesQuery = realm.where(MessageItem.class);

        // Apply conditions
        // 1. Thread to look into
        if (threadId != -1)
            allMessagesQuery = allMessagesQuery.equalTo(MessageItem.COLUMN_THREAD_ID, threadId);

        // 2. Message IDs to exclude
        for (final Long excludedMessageId : excludedMessageIds) {

            allMessagesQuery = allMessagesQuery.notEqualTo(
                    MessageItem.COLUMN_MESSAGE_ID,
                    excludedMessageId
            );

        }

        return allMessagesQuery.findAll();

    }
Saket
  • 2,945
  • 1
  • 29
  • 31

1 Answers1

3

There is no such method like that. Probably you could try to add field like private boolean excluded and set it to true where you exclude your messages. Then query all like this

return realm.where(MessageItem.class)                
            .equalTo(MessageItem.COLUMN_THREAD_ID, threadId);
            .equalTo(MessageItem.COLUMN_EXCLUDED, false);
            .findAll();
Bastien Jansen
  • 8,756
  • 2
  • 35
  • 53
uneven
  • 341
  • 2
  • 13
  • Adding unnecessary columns for every column I want to exclude would be a terrible choice. Is there anything wrong in adding notEqualTo() multiple times? – Saket Sep 15 '15 at 08:19
  • @Saket, I think it depends on count of your messages. In my opinion this is better way have additional column instead of doing too much queries – uneven Sep 16 '15 at 03:23