Android 我如何在房间里处理日期和时间
我有下面的模型,其中包括,Android 我如何在房间里处理日期和时间,android,kotlin,android-room,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:
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?
)
但我得到了以下错误:
无法确定如何将此字段保存到数据库中。你可以
考虑为它添加类型转换器。
因此,我编写了以下转换器:
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()
}
}
数据库:
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
}
}
}
}
及
但不知道如何将此转换器与数据库模型一起使用
您没有使用正确的注释<代码>javax.persistence在Android SDK中不存在-我希望您的代码无法编译
该错误消息所指的是
因此,切换上面显示的类以使用
@TypeConverter
。然后,将@typeconverter(LocalDateAttributeConverter::class)
添加到赋值
实体中。或者,如果您愿意,可以将@typeconverter(LocalDateAttributeConverter::class)
添加到RoomDatabase
子类中,这将允许您在任何实体中使用LocalDate
属性。我就是这样使用类型转换器的
@Database(
entities = [EventCategory::class, Workshop::class, EventDetails::class, UserProfile::class, Message::class],
version = 2,
exportSchema = false
)
@TypeConverters(EventListConverter::class, WorkshopConverter::class, UserProfileConverter::class)
abstract class MyDatabase : RoomDatabase() {
@TypeConverters(EventListConverter::class)
abstract fun eventCategoryDao(): EventCategoryDao
@TypeConverters(WorkshopConverter::class)
abstract fun workshopListDao(): WorkshopListDao
abstract fun eventDetailsDao(): EventDetailsDao
@TypeConverters(UserProfileConverter::class)
abstract fun userProfileDao(): UserProfileDao
abstract fun confessionDao(): ConfessionDao
}
val db = Room.databaseBuilder(App.instance, MyDatabase::class.java, "database")
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build()
您可以为不同的Dao使用不同类型的转换器
long time = new Date().getTime();
long sysTime = System.currentTimeMillis();
以上两个都将返回相同的长类型值。所以,你可以用其中一个。甚至可以像这样转换为小时、分钟或秒(在赋值时非常有用):
在这里,date将返回int值(今天为3),FormattedDate将返回String值(今天为03-08-2019)
所以,在room数据库类中可以做的是,为time声明long类型变量,为date声明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)
}
在模型/房间中,如下所示:
@Entity
data class Assignment(
@ColumnInfo(name = "lastUpdate") val lastUpdate: String?
)
从日期中获取
long
值(时间),并保存该值,然后从该长度重新创建日期value@a_local_nobody请参阅我更新的问题将数据库变量time设置为long,并在为其赋值时,通过System.currentTimeMillis()将时间值转换为long。您甚至可以将它们转换为秒inserting@Psycho你能给出示例代码吗?我不知道这个的kotlin语法。。我将展示java语法吗?不理解这一点,请将上面显示的类切换为使用@TypeConverter@HasanAYousef:在您的问题中,您有一个LocalDateAttributeConverter
Kotlin类。这不是使用正确的注释。按照中的说明,将LocalDateAttributeConverter
更改为使用@TypeConverter
,HasanAYousef:您还需要LocalTime?
转换器。FWIW,请参阅示例Kotlin@TypeConverter
类以及我如何将其应用于数据库。
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());
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)
}
@Entity
data class Assignment(
@ColumnInfo(name = "lastUpdate") val lastUpdate: String?
)