如何使用 anko 在 Kotlin 中删除除最新 10 条记录以外的所有记录?

How can delete all records except latest 10 records with in Kotlin with anko?

代码B定义了一个Logtable,我希望清除除最近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
        )
    } 

}

在下面的位置检查相同的源代码

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 线程中看到

现在结合上面和下面的 SO 线程

Delete all but top n from database table in 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 设置来测试和确认相同的内容。但如果遇到问题,您可以提供反馈

如果你在谈论如何使用列表来做到这一点,那么它会比你可以尝试的更简洁:

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