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個のメソッドがあり、メソッドを追加した後にこのエラーがポップアップしました(完全に機能する別のメソッドからコピーして貼り付け、設定するフィールドを変更しました)。
DAO
sのクラス全体を投稿できましたが、どのメソッドが失敗したかを知る方法を求めています。 Run with --stacktrace
、Run with --info
および--debug option
、しかしこれらはどれも貴重な情報を表示しません。
追加したメソッドは@Query
UPDATE
_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
私はこの問題について一日中過ごします。解決策は非常に簡単でした。以前このようなものを使用していました
@Query("SELECT * FROM myTable")
fun getAll(): MutableLiveData<ArrayList<myData>>
ArrayListをListに変更し、MutableLiveDataをLiveDataに変更すると、正常に動作するようになりました。
@Query("SELECT * FROM myTable")
fun getAll(): LiveData<List<myData>>
この問題に対する回答とコメントに基づいて、私はMutableLiveDataとArrayListのみでも試してみたので、部屋とリストのみをサポートすると思います。どの組み合わせも機能しませんでした。
これが数時間誰かを助けることを願っています。
うん、コメントで述べたことに基づいて、戻り値の型をList
からDao
内の他の何かに変更することはできません。ルームは他の戻り値のタイプを処理する方法を知らないと思います。 List
を取得し、Dao
の外部の目的の型にキャスト/変換します。
私の場合、部屋からすべてのものを取得するためにDaoクラスでLiveData<ArrayList<Example Class>>
を使用したときにこの問題が発生し、ArrayList
をList
に変更したときにこれを修正しました。
例(Kotlin):
@Dao
interface ExampleDao {
@Query("SELECT * from example_table")
fun getAllExample():LiveData<List<Example>>
}
Build.gradleのdefaultConfig内に以下のコードを追加します
javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true
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を使用している場合、このエラーも発生します。
最近、同じ問題が発生しましたが、Coroutines
関数内でDao
を使用していました。次のようなものです。
@Query("SELECT * FROM Dummy")
suspend fun get: LiveData<List<Dummy>>
コンパイルできませんでしたが、suspend
を削除した後はすべて正常に機能しました。
私にとっては、クエリに間違った戻り値の型を使用していました。
メソッドによって返されるクラスに@Relationアノテーションを含める必要があります。 Roomが2つの関係を確立する方法を知る唯一の方法です。
私にとっては、getメソッドの戻り値の型としてMutableLiveDataからLiveDataに変更することでした。
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();
私の場合、「カーソルをこのメソッドの戻り値型に変換する方法がわからない」を取得した後:
「ビルド」を削除して再ビルドすると、エラーが消えます。
Sumやcountなどの集計関数をクエリで実行し、列名にエイリアスを使用しようとしたときにこのエラーが発生しました。
select count(users.id) as userCount, ...
上記のuserCount
のようなエイリアス名、一致する必要がありますモデル内のフィールド名。
AndroidXとPre-AndroidXを混合したためです。完全な移行と これを実行 の後、すべてが正常に戻りました。 (もちろんAndroidX-Roomに移動しました)