- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 房间
。我需要有关如何将 LocalDate
从 java.time
转换为格式(可能是 Long
、TimeStamp
、 sql.Date
或者我什至不知道还有什么)这样我就可以将日期保存到数据库中。
我有一个图书实体:
@Entity
data class Book(
@ColumnInfo(name = "date") val date: LocalDate,
@ColumnInfo(name = "count") val count: Int,
@PrimaryKey(autoGenerate = true)
val id: Int? = null
)
我还创建了 Book DAO:
@Dao
interface BookDao {
@Query("SELECT * FROM book WHERE :date >= book.date")
fun getBooks(date: LocalDate): List<Book>
}
现在,我不确定如何创建将 LocalDate
转换为 . . . (同样,我什至不知道我应该将我的 LocalDate
转换成什么。它是 Long
、TimeStamp
、sql.Date
或其他任何内容)。
我认为我应该将LocalDate
转换为sql.Date
以便Room
可以保存它。所以,我这样创建了我的转换器:
Converters.kt
class Converters {
@TypeConverter
fun convertLocalDateToSqlDate(localDate: LocalDate?): Date? {
return localDate?.let { Date.valueOf(localDate.toString()) }
}
@TypeConverter
fun convertSqlDateToLocalDate(sqlDate: Date?): LocalDate? {
val defaultZoneId = systemDefault()
val instant = sqlDate?.toInstant()
return instant?.atZone(defaultZoneId)?.toLocalDate()
}
}
但是,我得到了错误:
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
private final java.time.LocalDate date = null;
最佳答案
您遇到的问题是 TypeConverter 应该从/到 Room 支持插入/提取数据的一组特定类型之间进行转换。
一些比较常见的是 Int、Long Byte、Byte[]、Float、Double、Decimal、String、BigInt、BigDecimal。
因此消息说请转换您的 LocalDate 或 Date,因为它无法处理它们。
我建议将日期存储为 unix 日期(除非你想要微秒精度,而你可以用毫秒存储时间(这在 sqlite 中使用日期/时间函数时可能有点尴尬并且可能需要转换))即作为长整数或整数。
这样做你:
下面是一个示例,展示了一些功能,将它们存储为 unix 时间戳
首先是使用默认日期的图书实体版本:-
@Entity
data class Book(
@ColumnInfo(name = "date", defaultValue = "(strftime('%s','now','localtime'))")
val date: Long? = null,
@ColumnInfo(name = "count")
val count: Int,
@PrimaryKey(autoGenerate = true)
val id: Int? = null
)
伴随书实体书道:-
@Dao
interface BookDao {
@Insert /* insert via a book object */
fun insert(book: Book): Long
@Query("INSERT INTO BOOK (count) VALUES(:count)")
/* insert supplying just the count id and date will be generated */
fun insertBook(count: Long): Long
@Query("SELECT * FROM book")
/* get all the books as they are stored into a list of book objects*/
fun getAllFromBook(): List<Book>
/* get the dates as a list of dates in yyyy-mm-dd format using the SQLite date function */
@Query("SELECT date(date, 'unixepoch', 'localtime') AS mydateAsDate FROM book")
fun getDatesFromBook(): List<String>
/* get the date + 7 days */
@Query("SELECT date(date,'unixepoch','localtime','+7 days') FROM book")
fun getDatesFromBook1WeekLater(): List<String>
}
Activity (非常标准的 BookDatabase 类,因此不包括在内)
class MainActivity : AppCompatActivity() {
lateinit var db: BookDatabase
lateinit var dao: BookDao
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
db = BookDatabase.getInstance(this)
dao = db.getBookDao()
/* Insert two rows */
dao.insert(Book(System.currentTimeMillis() / 1000,10)) /* don't want millisecs */
dao.insertBook(20) /* use the date columns default value (similar to the above) */
/* get and log the date objects */
for(b: Book in dao.getAllFromBook()) {
Log.d("BOOKINFO_BOOK", " Date = ${b.date} Count = ${b.count} ID = ${b.id}")
}
/* get the dates in yyy-mm-dd format */
for(s: String in dao.getDatesFromBook()) {
Log.d("BOOKINFO_DATE",s)
}
/* get the dates but with a week added on */
for(s: String in dao.getDatesFromBook1WeekLater()) {
Log.d("BOOKINFO_1WEEKLATER",s)
}
}
}
运行后的日志:-
2021-04-16 14:28:50.225 D/BOOKINFO_BOOK: Date = 1618547330 Count = 10 ID = 1
2021-04-16 14:28:50.225 D/BOOKINFO_BOOK: Date = 1618583330 Count = 20 ID = 2
2021-04-16 14:28:50.226 D/BOOKINFO_DATE: 2021-04-16
2021-04-16 14:28:50.227 D/BOOKINFO_DATE: 2021-04-17
2021-04-16 14:28:50.228 D/BOOKINFO_1WEEKLATER: 2021-04-23
2021-04-16 14:28:50.228 D/BOOKINFO_1WEEKLATER: 2021-04-24
根据数据库检查员的数据库:-
关于android - 如何创建将 LocalDate 转换为 Room 可以理解/保存的格式的 TypeConverter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67108957/
我正在尝试计算 2 个 localDates 之间的天数 我从这个答案中获得灵感:https://stackoverflow.com/a/325964对于这个问题Determine Whether T
我在使用 Joda daysBetween 函数时遇到问题。它一直在告诉我 The method daysBetween(ReadableInstant, ReadableInstant) in th
初始问题: 在Scala中,我想使用隐式 Ordering[T]#Ops比较两个LocalDate . 它只是使用像 > 这样的“运算符”而不是isAfter . 它应该只是一个导入:import s
如何删除 localDate 中的 T? 我需要删除“T”以匹配数据库中的数据。 这是我的代码 DateTimeFormatter formatter = DateTimeFormatter.ofPa
这个问题已经有答案了: How to format LocalDate object to MM/dd/yyyy and have format persist (4 个回答) How can you
这个问题在这里已经有了答案: What is the difference between public, protected, package-private and private in Jav
这个问题已经有答案了: SimpleDateFormat ignoring month when parsing (4 个回答) Java date format conversion - getti
这个问题已经有答案了: SimpleDateFormat ignoring month when parsing (4 个回答) Java date format conversion - getti
这个问题在这里已经有了答案: Localdate.format, format is not applied (2 个答案) How to format LocalDate to string? (
这个问题在这里已经有了答案: Importing two classes with same name. How to handle? (11 个回答) 7年前关闭。 我正在练习如何处理日期。但是当我
根据 Joda 中的文档: public LocalDate(int year, int monthOfYear, int dayOfMonth, Chronology chron
我正在尝试开发一个独立于 GWT 的通用模块,直到它实际在 GWT 应用程序中使用为止。问题是 GWT 不支持 joda 并且我的模块不使用 GWT。 我想要实现的目标(这行不通): 最
问题:Spring 似乎对 LocalDate 使用不同的反序列化方法,具体取决于它是出现在 @RequestBody 还是请求 @ReqestParam -这是正确的吗?如果是这样,是否有办法将它们
我想使用 Java8 DateTime API 中的 LocalDate 和 LocalDateTime,并且在值为 null 时无法坚持到 postgresql date 和 timestamp。
我正在做以下编程练习:Unlucky Days 。声明如下: Friday 13th or Black Friday is considered as unlucky day. Calculate h
这个问题已经有答案了: Java 8 LocalDateTime is parsing invalid datetime (5 个回答) How to sanity check a date in J
我有一个包含以下字段的员工类。 class Employee { final int id; final String name; final LocalDate update
这个问题已经有答案了: If statement gives condition is always true (4 个回答) 已关闭 3 年前。 我试图将两个日期与日期列表进行比较(列表元素已被删除
被这个问题困扰了一段时间,希望得到一些意见。我想验证用户输入的日期,以便我可以使用 LocalDate 对象执行计算。但是,当输入有效日期时,返回的日期是前一个无效日期,这会引发异常并崩溃。我错过了什
这个问题已经有答案了: How can I parse/format dates with LocalDateTime? (Java 8) (11 个回答) 已关闭 3 年前。 我有一个日期时间信息字
我是一名优秀的程序员,十分优秀!