使用kotlin

时间:2017-08-17 02:50:19

标签: android kotlin android-room

试图用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);

1 个答案:

答案 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

希望它有所帮助。