Has*_*sef 4 android kotlin android-room
我有下面的模型,其中包括date和time领域
import androidx.room.Entity
import androidx.room.PrimaryKey
import java.time.LocalDate
import java.time.LocalTime
@Entity
data class Assignment(
@PrimaryKey(autoGenerate = true) val tid: Int,
// @PrimaryKey val uid: Int,
@ColumnInfo(name = "id") val id: Int,
@ColumnInfo(name = "task") val task: String?,
@ColumnInfo(name = "address") val address: String?,
@ColumnInfo(name = "datePicker") val datePicker: LocalDate?,
@ColumnInfo(name = "timePicker") val timePicker: LocalTime?,
@ColumnInfo(name = "status") val status: String?
)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。
所以,我写了下面的转换器:
import java.sql.Date
import java.time.LocalDate
import javax.persistence.AttributeConverter
import javax.persistence.Converter
import java.time.ZoneId.systemDefault
@Converter(autoApply = true)
class LocalDateAttributeConverter : AttributeConverter<LocalDate, Date> {
override fun convertToDatabaseColumn(locDate: LocalDate?): Date? {
return if (locDate == null) null else Date.valueOf(locDate.toString())
}
override fun convertToEntityAttribute(sqlDate: Date?): LocalDate? {
val defaultZoneId = systemDefault()
val instant = sqlDate?.toInstant()
return instant?.atZone(defaultZoneId)?.toLocalDate()
}
}
Run Code Online (Sandbox Code Playgroud)
但是不知道怎么用这个convertor配合数据库model?
更新 根据收到的答案,我将代码更改为如下所示,但仍然出现相同的错误:
转换器:
import androidx.room.TypeConverter
import java.sql.Date
import java.time.LocalDate
import java.time.ZoneId.systemDefault
class Converters {
@TypeConverter
fun convertToDatabaseColumn(locDate: LocalDate?): Date? {
return locDate?.let { Date.valueOf(locDate.toString()) }
}
@TypeConverter
fun convertToEntityAttribute(sqlDate: Date?): LocalDate? {
val defaultZoneId = systemDefault()
val instant = sqlDate?.toInstant()
return instant?.atZone(defaultZoneId)?.toLocalDate()
}
}
Run Code Online (Sandbox Code Playgroud)
数据库:
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import kotlinx.coroutines.CoroutineScope
@Database(entities = [Assignment::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun assignmentDao(): AssignmentDao
companion object {
@Volatile
var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context,
scope: CoroutineScope
): AppDatabase {
val tempInstance = INSTANCE
if (tempInstance != null) {
return tempInstance
}
synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"database-name"
).addCallback(AppDatabaseCallback(scope))
.build()
INSTANCE = instance
return instance
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
和
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.TypeConverters
import java.time.LocalDate
import java.time.LocalTime
//import javax.persistence.Convert
@Entity
data class Assignment(
@PrimaryKey(autoGenerate = true) val tid: Int,
// @PrimaryKey val uid: Int,
@ColumnInfo(name = "id") val id: Int,
@ColumnInfo(name = "task") val task: String?,
@ColumnInfo(name = "address") val address: String?,
@ColumnInfo(name = "timePicker") val timePicker: LocalTime?,
@ColumnInfo(name = "status") val status: String?,
@TypeConverters(Converters::class)
@ColumnInfo(name = "datePicker") val datePicker: LocalDate?
)
Run Code Online (Sandbox Code Playgroud)
long time = new Date().getTime();
long sysTime = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)
以上两者都将返回相同的长型值。所以,你可以只使用其中之一。甚至可以像这样转换为小时、分钟或秒(这在分配值时很有用):
int hours = (int) TimeUnit.MILLISECONDS.toHours(System.currentTimeMillis());
int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis());
int seconds = (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
int date = new Date().getDate();
String formatedDate = new SimpleDateFormat("dd-MM-yyyy").format(new Date());
Run Code Online (Sandbox Code Playgroud)
在这里,date 将返回值作为 int(今天为 3),formatedDate 将返回值作为 String(今天为 03-08-2019)。
所以,你可以在你的房间数据库类中做什么,为时间声明 long 类型变量,为日期声明 int/String(你喜欢的)。然后,在为这些变量赋值时,请使用上述技术。
在 Kotlin 中可以这样做:
button.setOnClickListener {
val formatedDate = SimpleDateFormat("yyyy-MM-dd").format(Date())
val formatedTime = SimpleDateFormat("HH:mm").format(Date())
val DateTime = "$formatedDate $formatedTime"
appViewModel.updateLastUpdateById(this, task_id, DateTime)
}
Run Code Online (Sandbox Code Playgroud)
在模型/房间中,如:
@Entity
data class Assignment(
@ColumnInfo(name = "lastUpdate") val lastUpdate: String?
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7183 次 |
| 最近记录: |