- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
尝试使用 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/
我正在查看Kotlin Github page我注意到 Kotlin 语言本身大部分是用 Kotlin 编写的:我只是想知道,一种语言怎么可能大部分都是用它自己的语言编写的?在您可以使用正在创建的语言
我有以下非常简单的 kotlin 代码来演示中缀函数 com.lopushen.demo.presentation 包 fun main(args: Array) { print("Hello
我在 Java 中有 2 个模型类,其中一个扩展了另一个 @UseStag public class GenericMessages extends NavigationLocalizationMap
Kotlin 代码 runBlocking { flow { for (i in 0..4) { println("Emit $i")
这三个 Kotlin 插件和它们的实际作用有什么区别? plugins { id 'kotlin-android' id 'org.jetbrains.kotlin.android'
我正在为某些现有库添加 Kotlin 原生 linuxX64 目标支持。库已成功编译,但在运行测试用例时,出现以下运行时错误: kotlin.native.concurrent.InvalidMuta
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 2 年前。 Improve t
我创建了一个类并向其添加了一个与成员函数具有相同签名的扩展,并执行了这个方法,它总是执行成员方法。 class Worker { fun work() = "...working" } fun
我知道传递给函数的参数将被视为“val”,即使变量被初始化为“var”。但这对我来说一直是个问题。在下面的示例代码中,我想通过使用函数“changeNum”修改变量“num”的值。但当然,Kotlin
现在,我正在尝试用 Kotlin 重写我的 Java 应用程序。然后,我遇到了日志语句,比如 log.info("do the print thing for {}", arg); 所以我有两种方法可
有点出名article关于许多语言的异步编程模型的状态,指出它们存在“颜色”问题,特别是将生态系统分为两个独立的世界:异步和非异步。以下是这种语言的属性: 每个函数都有一种颜色,红色或蓝色(例如asy
因为 KDoc 文档生成引擎是 abandoned in favor of Dokka , Kotlin 文档应该称为“KDoc 注释”,还是“Dokka 注释”? 最佳答案 如所述here , KD
我想在可空对象上传递函数引用。以 Android 为例,假设我想使用 Activity#onBackPressed来自作为该事件的子级的片段。 如果我想调用这个函数,我可以很容易地做到 activit
我有一个列表 (x, y)其中y只能是 0 或 1 这样 例如: [(3, 0), (3, 1), (5, 1)] [(5, 0), (3, 1), (5, 1)] [(1, 1), (3, 1),
从强类型语言的定义来看: A strongly-typed programming language is one in which each type of data (such as intege
这不能编译的事实是否意味着它们不是一流的类型? fun foo(s: String): Int = s.length // This won't compile. val bar = foo 有没有办
如果在 Java i++是一个表达式和 i++;是一个表达式语句,分号(;) 在 Kotlin 中是可选的,是 i++ Kotlin 中的表达式或表达式语句? 最佳答案 i++是一个表达式,因为它有一
代码(如下所示)是否正确?它取自 Kotlin-docs.pdf 的第 63 页,这也是 https://kotlinlang.org/docs/reference/generics.html 的最后
我正在尝试使用 Kotlin 为 Android 的一些全局 API 解析器(检查网络连接、调用 API 并通过来自源的单个调用返回格式化数据),并且在某些时候我不得不创建一个通用类型 object就
kotlinlang 中的任务: 使用月份变量重写此模式,使其与格式 13 JUN 1992(两位数字、一个空格、一个月份缩写、一个空格、四位数字)中的日期相匹配。 答案是:val month = "
我是一名优秀的程序员,十分优秀!