Stackmob SMQuery ИЛИ условие: "Сортировка не может использоваться с инструкциями ИЛИ stackmob"

Я использую Stackmob SMQuery и пытаюсь создать Query with 4 OR условия и отсортировать все результаты в конце концов. Мой код, как показано ниже. Проблема в

        SMQuery *query = [[SMQuery alloc] initWithSchema:STACKMOB_SCHEMA_TESTIMONIAL];

        [query where:@"friend_id" isIn:[friendFacebookIds arrayByAddingObject:[KKKeychain getStringForKey:@"facebookId"]]];

        // WHERE (privacy == Public OR (privacy == Private AND friend_id == myFacebookId) OR (privacy == Restricted AND myFacebookId NOT IN restricted_Ids))

        SMQuery *subQuery0 = [[SMQuery alloc] initWithSchema:STACKMOB_SCHEMA_TESTIMONIAL];
        SMQuery *subQuery1 = [[SMQuery alloc] initWithSchema:STACKMOB_SCHEMA_TESTIMONIAL];
        SMQuery *subQuery2 = [[SMQuery alloc] initWithSchema:STACKMOB_SCHEMA_TESTIMONIAL];
        SMQuery *subQuery3 = [[SMQuery alloc] initWithSchema:STACKMOB_SCHEMA_TESTIMONIAL];

        [subQuery0 where:@"privacy" isEqualTo:nil]; // just in case no privacy was set, assume it is public
        [subQuery0 orderByField:@"createddate" ascending:NO];

        [subQuery1 where:@"privacy" isEqualTo:[NSNumber numberWithInt:TTPrivacyLevelPublic]];
        [subQuery1 orderByField:@"createddate" ascending:NO];

        [subQuery2 where:@"privacy" isEqualTo:[NSNumber numberWithInt:TTPrivacyLevelPrivate]];
        [subQuery2 where:@"user_id" isEqualTo:[KKKeychain getStringForKey:@"facebookId"]]; // for private post, I can only see posts that were created by me
        [subQuery2 orderByField:@"createddate" ascending:NO];

        [subQuery3 where:@"privacy" isEqualTo:[NSNumber numberWithInt:TTPrivacyLevelRestricted]];
        [subQuery3 where:@"restricted_user_ids" isNotEqualTo:[KKKeychain getStringForKey:@"facebookId"]]; // make sure I'm not restricted to see
        [subQuery3 orderByField:@"createddate" ascending:NO];

        // combine subquery to main query

        [query and:[[[subQuery1 or:subQuery2] or:subQuery3] or:subQuery0]];

        [query orderByField:@"createddate" ascending:NO];
        ....

Так что, если я прокомментировал последнюю строку "[query orderByField:@"creationdate" ascending:NO];" тогда работает нормально. Но тогда результаты будут представлять собой комбинацию из 4 разных наборов данных, которые не отсортированы в порядке создания. Я также пытался сортировать в каждом подзапросе, но результат также был неверным, потому что они отсортированы только внутри каждого подзапроса, не объединяясь с другими результатами.

Благодарю.

1 ответ

База данных не поддерживает выполнение запроса, который включает в себя как ИЛИ, так и сортировку - это ограничение базы данных. Вместо этого выполните запрос к StackMob, а затем локально отсортируйте результаты по методу createdate, используя sortedArrayUsingComparator или что-то подобное.

Другие вопросы по тегам