Как можно удалить все записи, кроме последних 10 записей в Kotlin с Anko? - PullRequest
0 голосов
/ 11 мая 2018

Код B определяет таблицу журнала, я надеюсь очистить все записи, кроме последних 10 записей.

В настоящее время я сначала перечисляю все записи в порядке CreatedDate, затем делаю цикл с 11-й записи до последней и удаляю запись, используя код A.

Есть ли лучший способ сделать это в Kotlin с помощью anko?

Код A

fun deleteDBLogByID(_id:Long)=mDBLogHelper.use{
        delete(DBLogTable.TableNAME,"$idName = {$idName} ","$idName" to _id.toString() )
}

Код B

class DBLogHelper(mContext: Context = UIApp.instance) : ManagedSQLiteOpenHelper(
        mContext,
        DB_NAME,
        null,
        DB_VERSION) {

    companion object {
        val DB_NAME = "log.db"
        val DB_VERSION = 1
        val instance by lazy { DBLogHelper() }
    }

    override fun onCreate(db: SQLiteDatabase) {
        db.createTable( DBLogTable.TableNAME , true,
                DBLogTable._ID to INTEGER + PRIMARY_KEY+ AUTOINCREMENT,
                DBLogTable.CreatedDate to INTEGER,
                DBLogTable.Status to INTEGER  +DEFAULT("0"),
                DBLogTable.Description to TEXT
        )
    } 

}

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Если вы говорите о том, как сделать это со списком, чтобы он был более кратким, чем вы можете попробовать:

list.filterIndexed({ index, _ -> index > 10 }).forEach { delete(it) }

0 голосов
/ 22 мая 2018

Проверка исходного кода того же в расположении ниже

https://github.com/Kotlin/anko/blob/e388295c70963d97d26820d4ecdf48ead8dba05e/anko/library/static/sqlite/src/Database.kt#L73

Определение функции также принимает whereClause

fun SQLiteDatabase.delete(tableName: String, whereClause: String = "", vararg args: Pair<String, Any>): Int {
    return delete(tableName, applyArguments(whereClause, *args), null)
}

, который вы также можете увидетьв нижнем SO потоке

Как удалить строки в SQLite с кратными, используя аргументы Anko?

Теперь объединяем выше и ниже SO thread

Удалить все, кроме верхнего n из таблицы базы данных в SQL

WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n);

Вы можете сделать что-то вроде ниже

delete(TABLE_NAME, whereClause = "WHERE _ID NOT IN (SELECT _ID FROM {TABLE_NAME} ORDER BY CreatedDate Desc LIMIT {TOP})", 
                                                "TOP" to 10,
                                                "TABLE_NAME" to TABLE_NAME)

Выше может потребоваться небольшая тонкая настройка, если это не такработать, но подход должен работать.У меня нет установки Kotlin для проверки и подтверждения того же.Но вы можете оставить отзыв, если у вас возникли проблемы

...