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

Hel*_*oCW 7 android kotlin anko

代码B定义了一个Log表,我希望清除除最新10条记录之外的所有记录.

目前,我首先按CreatedDate列出所有记录,然后从第11条记录到最后一条记录进行循环,并使用代码A删除记录.

有没有更好的方法在Kotlin与anko做到这一点?

代码A.

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

代码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
        )
    } 

}
Run Code Online (Sandbox Code Playgroud)

Tar*_*ani 3

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

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)
}
Run Code Online (Sandbox Code Playgroud)

你也可以在下面的SO线程中看到

如何使用 Anko 删除 SQLite 中具有多个 by where args 的行?

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

在 SQL 中从数据库表中删除除前 n 之外的所有内容

WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n);
Run Code Online (Sandbox Code Playgroud)

你可以做如下的事情

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)
Run Code Online (Sandbox Code Playgroud)

如果上面的方法不起作用,则可能需要进行小的微调,但该方法应该有效。我没有 Kotlin 设置来测试和确认同样的情况。但如果您遇到问题,可以提供反馈