在使用kotlin时,使用实体和Dao文件的正式/正确的方式是什么?

试图用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(注意,对于不同的房间版本,有人要求字段被初始化,在某些版本中,最后一个不能有默认值,而在某些版本中,所有的参数都可以没有初始化值,是否有人知道什么是正确的方式来为所有版本工作 – 也许是最新的版本之一。)

其他问题是当查询有参数时,编译器似乎会把它自己的名字放在生成的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:compiler: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); 

@Entity类中的属性应该在构造函数中添加,因为它也是在Kotlin中创建和初始化属性的默认和建议方法。 通过这种方式,您可以确保您的房间库代码可以在每个版本上运行。 (我已经使用它,并试图在所有版本,因为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. Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :p0. 错误。

Kotlin刚刚在8月15日(两天前)发布了它的1.1.4版本,我不确定这个版本是否允许使用精确的参数名称。

我没有使用apply plugin: 'kotlin-kapt'在我的房间-kotlin实现。 这不是为我工作。

有这条线kapt "android.arch.persistence.room:compiler:1.0.0-alpha1"是必要的,因为它的注释处理器房间库和没有它没有注释的意义(如: @DAO@DAO等)使用为房间实施。

检查这篇文章: https : //medium.com/@chandilsachin/room-with-unit-test-in-kotlin-4ad31a39a291

看看这个stackoverflow问题有更多的见解: Kotlin的房间持久性库实现

希望它有帮助。