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

Posted

技术标签:

【中文标题】如何在 Kotlin 中使用 anko 删除除最新 10 条记录之外的所有记录?【英文标题】:How can delete all records except latest 10 records with in Kotlin with anko? 【发布时间】:2018-05-11 08:39:44 【问题描述】:

代码B定义了一个Log表,希望清空除了最近10条记录以外的所有记录。

目前,我先按 CreatedDate 顺序列出所有记录,然后从第 11 条记录循环到最后一条记录,并使用 Code 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
        )
     


【问题讨论】:

我不知道 kotlin 也不知道 anko...但我知道 java 也许我建议你需要在 kotlin 中转换它 【参考方案1】:

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

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

How to delete rows in SQLite with multiple by where args using Anko?

现在结合上面和下面的 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 设置来测试和确认相同的内容。但是,如果您遇到问题,可以提供反馈

【讨论】:

谢谢!最新的anko好像删掉了关键字WhereClause 应该是fun deleteOldAndKeepLatest(maxLogCountToKeep:Int)=mDBLogHelper.use delete(DBLogTable.TableNAME, "$idName NOT IN (SELECT $idName FROM TABLE_NAME ORDER BY CreatedDate Desc LIMIT TOP)", "TOP" to maxLogCountToKeep, "TABLE_NAME" to DBLogTable.TableNAME) 吧?【参考方案2】:

如果您正在谈论如何使用列表来做到这一点,那么它会更简洁,而不是您可以尝试:

list.filterIndexed( index, _ -&gt; index &gt; 10 ).forEach delete(it)

【讨论】:

不是一个好的选择,因为如果您有 1M 条记录,您会触发 1M - 10 查询,然后您还会将数据返回给我们不需要的客户端。由于我们不关心记录,因此删除应该在服务器端使用不带回任何数据的查询自行完成

以上是关于如何在 Kotlin 中使用 anko 删除除最新 10 条记录之外的所有记录?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Kotlin Anko 中重用布局

在Android中用Kotlin的Anko运行后台任务(KAD 09)

体验:Anko + Kotlin

Kotlin/Anko/OpenCV/CameraView 无法创建处理程序,因为线程尚未调用 Looper.prepare()

最火Kotlin库之Anko详解

用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)