试图用kotlin的房间,找不到官方文件。以下是失败的一些发现。
让它适用于简单的情况,但仍然不确定它是否是正确的方式,所以在这里发布并希望有人知道办公室/正确的方式与kotlin一起做?
有两个问题, 第一个:在定义实体时,它必须放在构造函数中,如果没有,它将编译但不生成xx_impl.java,如:
@Entity(name = "user")
class User {
@ColumnInfo(name = "id") @PrimaryKey var id: String? = null
@ColumnInfo(name = "name") var name: String? = null
@ColumnInfo(name = "lastName") var lastName: String? = null
@ColumnInfo(name = "age") var age: Int = 0
}
但如果放入构造函数
@Entity(tableName = "post")
class DbPost (
@ColumnInfo(name = "title")
var title: String? = null,
@ColumnInfo(name = "authorId")
var authorId: Int? = null,
@ColumnInfo(name = "date")
var date: String? = null,
) {
@ColumnInfo(name = "id")
@PrimaryKey(autoGenerate=true)
var id: Int? = null
}
它会生成xxx_impl.java(注意,对于不同的房间版本,有人要求初始化字段,在某些版本中,最后一个不能使用默认值,在某些版本中,所有参数都可以没有初始化值,有谁知道它适用于所有版本的正确方法 - 也许是最新版本。)
其他问题是当查询有params时,编译器似乎会在生成的xx_impl.java文件中为它添加自己的名称(让你在生成xx_impl.java之前不知道要放在代码中的内容),在不同的kotlin版本中,它有所不同。
1。 在一个项目等级,它有 申请插件:' kotlin-kapt'
并使用kotlin_version =' 1.1.2-4'
compile "android.arch.persistence.room:runtime:$rootProject.versions.arch_comp"
kapt "android.arch.persistence.room:compiler:1.0.0-alpha1"
@Query("select * from post where id = :id”)
fun findPostById(id: Long): DbPost
error: Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :arg0.
e:
e: public abstract com.manijshrestha.todolist.data.DbPost findPostById(long p0);
^
在那里生成的xxx_impl.java使用了p0
@Override
public DbPost findPostById(long p0) {
final String _sql = "select * from post where id = ?";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1);
int _argIndex = 1;
_statement.bindLong(_argIndex, p0);
2。 在其他项目设置中使用kotlin_version =' 1.1.3-2'
compile "android.arch.persistence.room:runtime:1.0.0-alpha1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1"
kapt "android.arch.persistence.room:compiler:1.0.0-alpha1"
(注意:如果没有kapt" android.arch.persistence.room:编译器:1.0.0-alpha1“,它将不会生成xxx_impl.java文件)
当在xxDao文件中时,将查询参数放在':p0'
中@Query("select * from post where id = :p0")
fun loadPostById(id: Int): DbPost
抱怨道:
error: Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :p0.
error: Unused parameter: arg0
在那里生成了xxx_impl.java,它使用了arg0
@Override
public DbPost loadPostById(int arg0) {
final String _sql = "select * from post where id = ?";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1);
int _argIndex = 1;
_statement.bindLong(_argIndex, arg0);
答案 0 :(得分:1)
@Entity
类中的属性应该在构造函数中添加,因为它也是在Kotlin
中创建和初始化属性的默认和建议方式。这样您就可以确保您的房间lib代码适用于每个版本。 (我已经使用它并在所有版本中尝试过,因为Kotlin是官方的android语言))。
对于DAO类中的@Query
方法,应使用如下参数:arg0, arg1,..., argN
。
@Query("select * from post where id = :arg0 and name like :arg1”)
fun findPostByIdName(id: Long, name: String): DbPost
使用@Query
方法可以避免Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :p0.
错误。
Kotlin刚刚于8月15日(两天前)发布了1.1.4,我不确定此版本中是否允许使用确切的参数名称。
我没有在我的room-kotlin实现中使用apply plugin: 'kotlin-kapt'
。它不适合我。
拥有这一行kapt "android.arch.persistence.room:compiler:1.0.0-alpha1"
是必要的,因为它的Room lib的注释处理器没有它,没有用于Room实现的注释(如:@Entity
,@DAO
等)的含义。
查看此文章:https://medium.com/@chandilsachin/room-with-unit-test-in-kotlin-4ad31a39a291
请查看此stackoverflow问题,以获得更多信息:Room Persistence lib implementation in Kotlin
希望它有所帮助。