gpt4 book ai didi

android - 使用 kotlin 时制作实体和 Dao 文件的官方/正确方法是什么

转载 作者:太空狗 更新时间:2023-10-29 13:51:52 25 4
gpt4 key购买 nike

尝试使用 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(注意,对于不同的room版本,有人要求初始化字段,在某些版本中最后一个不能有默认值,在某些版本中所有参数都可以没有初始化值,有谁知道它适用于所有版本的正确方法是什么——也许是最新版本。)

另一个问题是当查询有参数时,编译器似乎会在生成的 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 方法将避免查询中的每个绑定(bind)变量都必须有一个匹配的方法参数。找不到 :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 的注解处理器,没有它就没有注解的意义(例如:@Entity@DAO 等)用于 Room 实现。

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

查看这个 stackoverflow 问题以获得更多见解:Room Persistence lib implementation in Kotlin

希望对您有所帮助。

关于android - 使用 kotlin 时制作实体和 Dao 文件的官方/正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45725856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com