如何使用 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
)
}
}
在下面的位置检查相同的源代码
函数定义也有一个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) }
代码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
)
}
}
在下面的位置检查相同的源代码
函数定义也有一个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) }