Как удалить первые n строк в области

Предположим, есть таблица с именем RecentViewItem, в которой хранятся недавно просмотренные пользователем элементы. Я хочу сохранить только первые 10 недавно просмотренных элементов, удалив все остальные элементы. Мой запрос выглядит следующим образом:

RealmResults<RecentViewItem> results = 
    realm.where(RecentViewItem.class)
         .findAllSorted("updatedAt", Sort.DESCENDING);
// What to do next ?

person iamcrypticcoder    schedule 26.12.2016    source источник


Ответы (2)


Поскольку Realm для Java лениво загружает свои данные, не существует LIMIT запроса, который добавляет немного работы. Я запрашиваю все данные, отсортированные по отметке времени (в вашем случае updatedAt).

Realm realm = Realm.getDefaultInstance();
final RealmResults<RecentViewItem> results = realm.where(RecentViewItem.class).findAllSorted("timestamp", Sort.DESCENDING);

Я проверяю, превышает ли он мой предел, и, если это так, получаю результат на пороге, чтобы я мог получить его timestamp. Затем я запрашиваю эту пороговую метку времени и удаляю все результаты до нее.

if (results.size() > UPPER_LIMIT) {
    RecentViewItem firstOverLimit = results.get(TRUNCATE_LIMIT);
    // Assuming a system time. Maybe your updatedAt is a date. Could use an id too.
    long threshold = firstOverLimit.timestamp;
    final RealmResults<RecentViewItem> resultsToDelete = realm.where(RecentViewItem.class).lessThanOrEqualTo("timestamp", threshold).findAll();
    Log.d(TAG, "cleanUp: total "+ results.size() +
        "; over threshold of " + UPPER_LIMIT +
        "; truncating to " + TRUNCATE_LIMIT +
        "; deleting " + resultsToDelete.size() +
        "; all on or before "+ threshold);
    realm.executeTransaction(realm1 -> resultsToDelete.deleteAllFromRealm());
}

Мой TRUNCATE_LIMIT составляет половину моего UPPER_LIMIT, так что эта очистка не выполняется постоянно по мере добавления новых записей, но вы можете настроить это по своему усмотрению.

Я также удаляю первую запись сверх лимита, но вы можете поиграть с границей и сохранить ее.

Кроме того, моя временная метка довольно точна, но если ваша дата просто «сегодня», вы получите более нечеткие результаты.

person LordParsley    schedule 02.05.2018

person    schedule
comment
Как насчет удаления первых 1000 или, предположим, 10 ^ 5 строк? На самом деле я ищу ответ без цикла. - person iamcrypticcoder; 26.12.2016
comment
Вы не найдете ответа без цикла, если у вас нет индекса, который вы можете обновить, для которого вы можете определить запрос, с помощью которого вы можете получить RealmResults, по которому вы можете вызвать deleteAllFromRealm() - person EpicPandaForce; 26.12.2016
comment
Я не совсем понял вашу мысль, может быть, вам нужен столбец, по которому вы можете получить только первые n строк и вызвать deleteAllFromRealm(). было бы лучше, если бы вы уточнили, плз. - person iamcrypticcoder; 26.12.2016
comment
@mahbub.kuet точно. - person EpicPandaForce; 26.12.2016
comment
Насколько мне известно, Realm не знает понятия количества строк. Таким образом, вы либо зацикливаетесь, либо определяете условие, которое дает вам то, что вы хотите. - person EpicPandaForce; 27.12.2016