背景
开发app时,有个界面使用了RecyclerView来展示多条数据,并且是以插入数据的先后顺序来展示。所以,在存入数据库时,最好也是以插入的先后顺序来存储。但是SQLite数据库默认不是按插入顺序排序,而是根据主键升序排序。如果在插入时不指定主键primary key,则会随机分配id,也达不到我想要的效果。
因此,这里提供一种解决思路:在数据库的表中增加一个插入时间属性。插入每条数据时,同时记录插入时的时间。在查询数据时,就按照插入时间升序排序即可。
一、数据库表增加insertTime属性
PersonDatabaseHelper.kt
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
class PersonDatabaseHelper(val context: Context, name: String, version: Int) :
SQLiteOpenHelper(context, name, null, version) {
private val createPerson = "create table Person (" +
"id integer primary key," +
"callId text," +
"name text," +
"image Blob," +
"callFree boolean," +
"insertTime text)" // 插入时间属性
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(createPerson)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("drop table if exists Person")
onCreate(db)
}
}
二、插入数据时添加插入时间
插入数据的Activity中添加以下代码,我这里是EditPersonActivity :
class EditPersonActivity : BaseActivity() {
// ActivityEditPersonBinding需替换为自己的Activity databinding
private val binding by lazy {
ActivityEditPersonBinding.inflate(layoutInflater) }
private lateinit var dbHelper : PersonDatabaseHelper
override fun onCreate(savedInstanceState: Bundle?) {
// personList是我的数据库
dbHelper = PersonDatabaseHelper(this, "personList.db", 2)
initView()
// ...
}
private fun initView() {
// ...
binding.run {
// btnEditTrue按钮的点击事件就是向personList表插入一条数据
btnEditTrue.setOnClickListener {
val db = dbHelper.writableDatabase
val values = ContentValues().apply {
// 给values的多个属性赋值
put("insertTime", getNow())
}
// Person是personList.db数据库中的表
db.insert("Person", null, values)
finish()
}
// ...
}
// ...
}
/**
getNow 输出格式:2023-01-08 19:34:39.734
**/
private fun getNow(): String {
return if (android.os.Build.VERSION.SDK_INT >= 24){
SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(Date())
}else{
val tms = Calendar.getInstance()
tms.get(Calendar.YEAR).toString() + "-" +
tms.get(Calendar.MONTH).toString() + "-" +
tms.get(Calendar.DAY_OF_MONTH).toString() + " " +
tms.get(Calendar.HOUR_OF_DAY).toString() + ":" +
tms.get(Calendar.MINUTE).toString() +":" +
tms.get(Calendar.SECOND).toString() +"." +
tms.get(Calendar.MILLISECOND).toString()
}
}
}
三、查询数据时,根据插入时间排序
查询数据的Activity中添加以下代码:
// insertTime asc 是关键,即按insertTime升序排序。拓展一下:desc是降序排序
val cursor = db.query("Person", null, null, null, null, null, "insertTime asc")
结果
插入几条数据后的Person表: