出行动态本地数据库相关操作基本完成

This commit is contained in:
tongchenfei
2020-07-08 15:29:04 +08:00
parent ba1ad762ef
commit 8d8c57269e
5 changed files with 90 additions and 26 deletions

View File

@@ -9,8 +9,8 @@ import androidx.room.PrimaryKey
* @author
*/
@Entity
data class TripRecord(@PrimaryKey(autoGenerate = true)
var id: Int = 0,
data class TripRecord(@PrimaryKey(autoGenerate = false)
var eventType:Int,
var canUsed: Boolean = true,
var isUsed: Boolean = false,
var entity: String? = null,

View File

@@ -2,20 +2,31 @@ package com.zhidao.mogo.module.event.panel.dao
import androidx.room.*
import com.zhidao.mogo.module.event.panel.bean.TripRecord
import io.reactivex.Flowable
import io.reactivex.Single
@Dao
interface TripRecordDao {
@Query(value = "SELECT * FROM TripRecord")
fun getAllTripRecord():Flowable<List<TripRecord>>
/**
* 查询当日数据
* @param limitTime 当日0点的时间戳
*/
@Query(value = "SELECT * FROM TripRecord WHERE recordTime > :limitTime ORDER BY recordTime DESC")
fun getAllTripRecord(limitTime:Long):Single<List<TripRecord>>
@Insert
fun insert(vararg tripRecord: TripRecord)
@Update
fun update(vararg tripRecord: TripRecord)
fun update(vararg tripRecord: TripRecord)
@Delete
fun delete(vararg tripRecord: TripRecord)
fun delete(vararg tripRecord: TripRecord)
/**
* 删除超时的数据即当天0时以前的数据
* 虽然注解是Query但是目的是执行后面的sql语句所以就不要在意这些细节了
*
* @param limitTime 当日0点的时间戳
*/
@Query(value = "DELETE FROM TripRecord WHERE recordTime < :limitTime")
fun deleteOvertimeTripRecord(limitTime: Long)
}

View File

@@ -2,6 +2,8 @@ package com.zhidao.mogo.module.event.panel.fragment
import android.util.Log
import com.mogo.commons.mvp.MvpFragment
import com.mogo.utils.logger.Logger
import com.zhidao.mogo.module.event.panel.EventPanelConstants.MODULE_NAME
import com.zhidao.mogo.module.event.panel.R
import com.zhidao.mogo.module.event.panel.bean.TripRecord
import com.zhidao.mogo.module.event.panel.presenter.TripRecordPresenter
@@ -18,7 +20,8 @@ class TripRecordFragment: MvpFragment<TripRecordFragment, TripRecordPresenter>()
override fun initViews() {
btnInsert.setOnClickListener {
val tripRecord = TripRecord()
val randomType = Random.nextInt(10000)
val tripRecord = TripRecord(randomType)
val random = Random.nextInt(10)
tripRecord.entity = "entity: $random"
tripRecord.recordTime = System.currentTimeMillis()
@@ -47,9 +50,13 @@ class TripRecordFragment: MvpFragment<TripRecordFragment, TripRecordPresenter>()
Log.d(TAG, "local list: $tripRecordList")
mPresenter.queryAllTripRecord()
}
}
override fun createPresenter(): TripRecordPresenter = TripRecordPresenter(this)
fun refreshTripRecord(tripRecords: List<TripRecord>) {
Logger.d(MODULE_NAME, "刷新出行动态:$tripRecords")
tripRecordList.clear()
tripRecordList.addAll(tripRecords)
}
}

View File

@@ -1,36 +1,71 @@
package com.zhidao.mogo.module.event.panel.presenter
import android.util.Log
import androidx.lifecycle.LifecycleOwner
import com.mogo.commons.mvp.Presenter
import com.mogo.utils.ThreadPoolService
import com.mogo.utils.logger.Logger
import com.zhidao.mogo.module.event.panel.EventPanelConstants.MODULE_NAME
import com.zhidao.mogo.module.event.panel.bean.TripRecord
import com.zhidao.mogo.module.event.panel.dao.TripRecordDatabase
import com.zhidao.mogo.module.event.panel.fragment.TripRecordFragment
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlin.concurrent.thread
import java.util.*
class TripRecordPresenter(view: TripRecordFragment) : Presenter<TripRecordFragment>(view) {
var queryDisposable:Disposable? = null
fun queryAllTripRecord() {
val disposable = TripRecordDatabase.getInstance(context).getTripRecordDao().getAllTripRecord().subscribeOn(Schedulers.io()).subscribe {
Log.d("TripRecordFragment", "db query: $it")
queryDisposable = TripRecordDatabase.getInstance(context).getTripRecordDao().getAllTripRecord(countLimitTime()).subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).map {
Logger.d(MODULE_NAME,"delete over time record when query thread is ${Thread.currentThread().name}")
TripRecordDatabase.getInstance(context).getTripRecordDao().deleteOvertimeTripRecord(countLimitTime())
it
}.observeOn(AndroidSchedulers.mainThread()).subscribe {it->
Log.d(MODULE_NAME, "db query: $it, thread is ${Thread.currentThread().name}")
mView.refreshTripRecord(it)
}
}
fun insertTripRecord(vararg records: TripRecord) {
fun insertTripRecord(vararg records: TripRecord) {
ThreadPoolService.execute {
TripRecordDatabase.getInstance(context).getTripRecordDao().insert(*records)
// 为了防止只进不出,所以在插入新数据时,进行过期数据删除操作
Logger.d(MODULE_NAME,"delete over time record when insert")
TripRecordDatabase.getInstance(context).getTripRecordDao().deleteOvertimeTripRecord(countLimitTime())
}
}
fun updateTripRecords(vararg records: TripRecord) {
fun updateTripRecords(vararg records: TripRecord) {
ThreadPoolService.execute {
TripRecordDatabase.getInstance(context).getTripRecordDao().update(*records)
}
}
fun deleteTripRecords(vararg records: TripRecord) {
fun deleteTripRecords(vararg records: TripRecord) {
ThreadPoolService.execute {
TripRecordDatabase.getInstance(context).getTripRecordDao().delete(*records)
}
}
/**
* 计算约束时间即当日0时
*/
private fun countLimitTime():Long{
val calendar = Calendar.getInstance()
calendar.time = Date()
calendar.set(Calendar.HOUR_OF_DAY,0)
calendar.set(Calendar.MINUTE,0)
calendar.set(Calendar.SECOND,0)
return calendar.timeInMillis
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
queryDisposable?.let {
if (!it.isDisposed) {
it.dispose()
}
}
}
}

View File

@@ -3,8 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/clPanelContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
android:layout_height="match_parent">
<TextView
android:id="@+id/tvTitle"
@@ -12,7 +11,7 @@
android:layout_height="match_parent"
android:gravity="center"
android:text="Trip Record"
android:textColor="#fff"
android:textColor="#000"
android:textSize="40sp" />
<Button
@@ -20,18 +19,18 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Insert"
android:textColor="#fff"
android:textColor="#000"
android:textSize="30sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toLeftOf="@+id/btnUpdate"/>
app:layout_constraintRight_toLeftOf="@+id/btnUpdate"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btnUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update"
android:textColor="#fff"
android:textColor="#000"
android:textSize="30sp"
app:layout_constraintLeft_toRightOf="@+id/btnInsert"
app:layout_constraintRight_toLeftOf="@+id/btnDelete"
@@ -42,7 +41,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete"
android:textColor="#fff"
android:textColor="#000"
android:textSize="30sp"
app:layout_constraintLeft_toRightOf="@+id/btnUpdate"
app:layout_constraintRight_toLeftOf="@+id/btnQuery"
@@ -53,10 +52,22 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Query"
android:textColor="#fff"
android:textColor="#000"
android:textSize="30sp"
app:layout_constraintLeft_toRightOf="@+id/btnDelete"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btnGenerate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="GenerateLimitTime"
android:textColor="#000"
android:textSize="30sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnInsert" />
</androidx.constraintlayout.widget.ConstraintLayout>