Litepal数据库调用更新时,需要迭代表内的非id字段,通过构建一个空的实例检查该字段是否等于默认值,来决定该字段是否更新。如果该表没有默认的无参构造方法则会抛 LitePalSupportException 异常。
当使用kotlin编写数据原型时,不能使用数据类data class,data class没有无参构造方法,需要将data class改为普通class。
data class BloggerModel(
var userId: String,
var userName: String,
var fullName: String,
var tagLabel: String,
var introInfo: String,
var avatarUrl: String,
var url: String,
var visitTime:Long=0L, //最近一次的访问时间
var count:Int=0, //访问次数
var id: Long = 0L
):LitePalSupport(),Serializable
//修改为
class BloggerModel() : LitePalSupport(), Serializable {
constructor(
userId: String,
userName: String,
fullName: String,
tagLabel: String,
introInfo: String,
avatarUrl: String,
url: String,
visitTime: Long,
count: Int,
id: Long
) : this() {
this.userId = userId
this.userName = userName
this.fullName = fullName
this.tagLabel = tagLabel
this.introInfo = introInfo
this.avatarUrl = avatarUrl
this.url = url
this.visitTime = visitTime
this.count = count
this.id = id
}
lateinit var userId: String
lateinit var userName: String
lateinit var fullName: String
lateinit var tagLabel: String
lateinit var introInfo: String
lateinit var avatarUrl: String
lateinit var url: String
var visitTime: Long = 0L //最近一次的访问时间
var count: Int = 0 //访问次数
var id: Long = 0L
}
以下是断点跟踪过程
1、调用update(id)进行更新:
![]()
2、更新字段:
3、逐一迭代非id字段:
4、当进行更新时,检查字段是否等于默认值(在这里抛出异常),不等于则更新该字段。当进行保存时直接更新字段,不需要检查:
5、判断字段是否等于默认值 的具体代码,注释:分析传入的字段。检查此字段是否有默认值。 baseObj 需要一个默认构造函数,否则会抛出 LitePalSupportException。:
6、创建一个空实例:
7、newInstance()方法:
综上,Litepal数据更新时会调用表的无参构造方法,编写表时需要注意保留无参构造方法。