web-dev-qa-db-ja.com

Room「カーソルをこのメソッドの戻り値型に変換する方法がわからない」:どのメソッド?

Error:Not sure how to convert a Cursor to this method's return type
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
Compilation failed; see the compiler error output for details.

Roomを使用すると、このエラーが発生します。どのメソッドが原因であるかを知りたいです。

複数のDAOがあり、合計で約60個のメソッドがあり、メソッドを追加した後にこのエラーがポップアップしました(完全に機能する別のメソッドからコピーして貼り付け、設定するフィールドを変更しました)。

DAOsのクラス全体を投稿できましたが、どのメソッドが失敗したかを知る方法を求めていますRun with --stacktraceRun with --infoおよび--debug option、しかしこれらはどれも貴重な情報を表示しません。

追加したメソッドは@QueryUPDATE _Int戻り値の型、 ドキュメント で提案されているように

UPDATEまたはDELETEクエリは、voidまたはintを返すことができます。 intの場合、値はこのクエリの影響を受ける行の数です。

編集:メソッドを削除して、DAOを作業状態に戻そうとしたが、それでもこのエラーが発生することを付け加えたい。

EDIT2:コメントで読めないため、gradleコンソール出力を追加します:

error: Not sure how to convert a Cursor to this method's return type
error: Not sure how to convert a Cursor to this method's return type
2 errors

:app:compileDebugJavaWithJavac FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 22s
24
David Corsalini

私はこの問題について一日中過ごします。解決策は非常に簡単でした。以前このようなものを使用していました

@Query("SELECT * FROM myTable")
fun getAll(): MutableLiveData<ArrayList<myData>>

ArrayListをListに変更し、MutableLiveDataをLiveDataに変更すると、正常に動作するようになりました。

@Query("SELECT * FROM myTable")
fun getAll(): LiveData<List<myData>>

この問題に対する回答とコメントに基づいて、私はMutableLiveDataとArrayListのみでも試してみたので、部屋とリストのみをサポートすると思います。どの組み合わせも機能しませんでした。

これが数時間誰かを助けることを願っています。

6
akshay bhange

うん、コメントで述べたことに基づいて、戻り値の型をListからDao内の他の何かに変更することはできません。ルームは他の戻り値のタイプを処理する方法を知らないと思います。 Listを取得し、Daoの外部の目的の型にキャスト/変換します。

31
Ali Kazi

私の場合、部屋からすべてのものを取得するためにDaoクラスでLiveData<ArrayList<Example Class>>を使用したときにこの問題が発生し、ArrayListListに変更したときにこれを修正しました。

例(Kotlin):

@Dao
interface ExampleDao {
@Query("SELECT * from example_table")
fun getAllExample():LiveData<List<Example>>
}
4
Fidan Bacaj

Build.gradleのdefaultConfig内に以下のコードを追加します

javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true
2
vijay
 class IdAndFullName {
     public int uid;
     @ColumnInfo(name = "full_name")
     public String fullName;
 }
 // DAO
 @Query("SELECT uid, name || lastName as full_name FROM user")
 public IdAndFullName[] loadFullNames();

クエリ結果とPOJOの間に不一致がある場合、Roomはこのエラーメッセージを表示します。

または、@ SkipQueryVerificationを使用している場合、このエラーも発生します。

0
live-love

最近、同じ問題が発生しましたが、Coroutines関数内でDaoを使用していました。次のようなものです。

@Query("SELECT * FROM Dummy")
suspend fun get: LiveData<List<Dummy>>

コンパイルできませんでしたが、suspendを削除した後はすべて正常に機能しました。

0
Danilo Lemes

私にとっては、クエリに間違った戻り値の型を使用していました。

0
Irshu

メソッドによって返されるクラスに@Relationアノテーションを含める必要があります。 Roomが2つの関係を確立する方法を知る唯一の方法です。

0
Aspiring Dev

私にとっては、getメソッドの戻り値の型としてMutableLiveDataからLiveDataに変更することでした。

0
Otziii

Daoを変更し、observableの代わりにFlowableを使用して、次の依存関係を追加します(rxjavaサポートのある部屋)

compile group: 'Android.Arch.persistence.room', name: 'rxjava2', version: '1.1.1'

Daoはflowableを返します。

@Query("SELECT * FROM TableX")
public abstract Flowable<List<EntityX>> getAllXs();
0
Mr.Q

私の場合、「カーソルをこのメソッドの戻り値型に変換する方法がわからない」を取得した後:

「ビルド」を削除して再ビルドすると、エラーが消えます。

0
David Guo

Sumやcountなどの集計関数をクエリで実行し、列名にエイリアスを使用しようとしたときにこのエラーが発生しました。

select count(users.id) as userCount, ...

上記のuserCountのようなエイリアス名、一致する必要がありますモデル内のフィールド名。

0
mike.kamau

AndroidXとPre-AndroidXを混合したためです。完全な移行と これを実行 の後、すべてが正常に戻りました。 (もちろんAndroidX-Roomに移動しました)

0
Tanasis