Paging3:在 Room DAO 中使用 PagingSource 作为返回类型时,“不确定如何将 Cursor 转换为此方法的返回类型”
Posted
技术标签:
【中文标题】Paging3:在 Room DAO 中使用 PagingSource 作为返回类型时,“不确定如何将 Cursor 转换为此方法的返回类型”【英文标题】:Paging3: "Not sure how to convert a Cursor to this method's return type" when using PagingSource as return type in Room DAO 【发布时间】:2020-12-01 23:57:40 【问题描述】:我试图为新的 Paging 3 库模仿 Google 的 codelab,当我尝试让 Room DAO 方法返回 PagingSource
时遇到以下错误:
D:\Programming\android\something\app\build\tmp\kapt3\stubs\debug\com\someapp\something\data\db\UsersDao.java:38: error: Not sure how to convert a Cursor to this method's return type (androidx.paging.PagingSource<java.lang.Integer,com.someapp.something.data.db.GithubUser>).
public abstract androidx.paging.PagingSource<java.lang.Integer, com.someapp.something.data.db.GithubUser> getUserByUserName(@org.jetbrains.annotations.NotNull()
^D:\Programming\Android\something\app\build\tmp\kapt3\stubs\debug\com\someapp\something\data\db\UsersDao.java:43: error: Not sure how to convert a Cursor to this method's return type (androidx.paging.PagingSource<java.lang.Integer,com.someapp.something.data.db.GithubUser>).
public abstract androidx.paging.PagingSource<java.lang.Integer, com.someapp.something.data.db.GithubUser> getUserByNote(@org.jetbrains.annotations.NotNull()
这是我的UsersDao.kt
:
@Dao
interface UsersDao
@Insert
fun insert(user: GithubUser): Completable
@Insert
fun insert(userList: List<GithubUser>): Completable
@Query("DELETE FROM userDb")
fun clearDb(): Completable
@Query("SELECT * FROM userDb")
fun getAllUsers(): Single<List<GithubUser>>
@Query("SELECT EXISTS(SELECT 1 FROM userDb WHERE username LIKE :userName)")
fun checkIfUserExists(userName: String): Boolean
@Query("SELECT note FROM userDb WHERE username LIKE :userName")
fun getNoteByUserName(userName: String): Single<String>
@Query("SELECT * FROM userDb WHERE username LIKE :userName")
fun getUserByUserName(userName: String): PagingSource<Int, GithubUser>
@Query("SELECT * FROM userDb WHERE note LIKE :note")
fun getUserByNote(note: String): PagingSource<Int, GithubUser>
我的GithubUser.kt
看起来像这样:
@Entity(tableName = "userDb", indices = arrayOf(Index(value = ["username"], unique = true)))
class GithubUser (
var username: String,
var note: String,
var url: String,
var avatarUrl: String
)
@PrimaryKey(autoGenerate = true)
var uid = 0
在 Paging Codelab 的 code 中,DAO 方法只返回一个 PagingSource
,在 Gradle 或其他任何东西中没有额外的注释/魔术选项。我还查看了来自 Github 的其他示例,例如使用 Paging 3 库的 this 和 this,它们只是返回 PagingSource
而没有任何问题。如果我错过了什么,谁能告诉我?
注意:在错误本身之前,我总是收到关于ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.1
的警告,但这个警告本身在过去没有引起任何问题,但我在这里注明以防万一。
编辑:我使用以下 Room/Paging lib 版本:
implementation "androidx.room:room-runtime:2.2.5"
kapt "androidx.room:room-compiler:2.2.5"
implementation 'androidx.room:room-rxjava2:2.2.5'
implementation "androidx.paging:paging-runtime:3.0.0-alpha03"
implementation 'androidx.paging:paging-rxjava2:3.0.0-alpha03'
【问题讨论】:
我遇到了同样的失败。你的依赖是什么? @RezaBigdeli 刚刚在主帖中添加了依赖项。 【参考方案1】:原来需要将Room版本提高到2.3.0-alpha02
或以上:
implementation "androidx.room:room-runtime:2.3.0-alpha02"
implementation "androidx.room:room-ktx:2.3.0-alpha02"
kapt "androidx.room:room-compiler:2.3.0-alpha02"
【讨论】:
我会试试这个 成功了。谢谢。我应该更加注意图书馆仍处于 alpha 阶段的事实,因此存在错误。 我对rxjava
依赖项使用了 alpha 版本,而对其他依赖项使用了稳定版本,导致上述类似错误。以上是关于Paging3:在 Room DAO 中使用 PagingSource 作为返回类型时,“不确定如何将 Cursor 转换为此方法的返回类型”的主要内容,如果未能解决你的问题,请参考以下文章
kotlin 升级到 1.6.0 后如何在 Room Dao 中使用挂起修饰符?
是否可以在没有 Dagger 模块的情况下提供 DAO 或 Room 数据库