如何在 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, _ -> index > 10 ).forEach delete(it)
【讨论】:
不是一个好的选择,因为如果您有 1M 条记录,您会触发1M - 10
查询,然后您还会将数据返回给我们不需要的客户端。由于我们不关心记录,因此删除应该在服务器端使用不带回任何数据的查询自行完成以上是关于如何在 Kotlin 中使用 anko 删除除最新 10 条记录之外的所有记录?的主要内容,如果未能解决你的问题,请参考以下文章
在Android中用Kotlin的Anko运行后台任务(KAD 09)
Kotlin/Anko/OpenCV/CameraView 无法创建处理程序,因为线程尚未调用 Looper.prepare()