Pengecualian Kamar di kelas yang tidak diberi anotasi

Saya memiliki kelas abstrak yang saya punya dua subkelas @Dao dari:

public abstract class PathBase
{
    private static final String PATH_DELIMITER = "/";

    abstract PathEntity getPath(Long id);
    abstract Long insertInternal(PathEntity row);
    abstract String getDatabase();

    abstract List<Long> getAncestorsInternal(String path);
    abstract List<Long> getDescendantsInternal(String path);
    ...
}

Segera setelah kelas ini diperpanjang sebesar @Dao:

@Dao public abstract class FolderDao extends PathBase

Saya mendapatkan kesalahan ini:

kesalahan: Metode DAO dapat dianotasi hanya dengan salah satu dari berikut ini: Sisipkan, Hapus, Kueri, Perbarui

untuk metode:

    abstract PathEntity getPath(Long id);
    abstract Long insertInternal(PathEntity row);
    abstract String getDatabase();

Ia tidak mengeluh tentang:

    abstract List<Long> getAncestorsInternal(String path);
    abstract List<Long> getDescendantsInternal(String path);

Bahkan jika itu menelusuri kelas @Entity PathEntity saya tidak tahu mengapa itu menimbulkan kesalahan untuk abstract String getDatabase();.

Adakah yang tahu apa yang terjadi di sini... Bug kamar?


person Anthony    schedule 23.10.2017    source sumber


Jawaban (2)


FWIW, saya mendapatkan kesalahan untuk kelima metode Anda, bukan hanya tiga metode pertama, saat saya menempelkan PathBase Anda ke dalam proyek, menukar salah satu entitas saya dengan PathEntity, dan membuat kelas DAO saya diperluas PathBase.

Metode ini tidak boleh abstract. Room menghasilkan implementasi FolderDao, dan Room tidak memiliki cara untuk mengimplementasikan metode tersebut. Pesan kesalahan spesifiknya tidak ideal, tetapi saya tidak tahu bagaimana cara kerjanya.

FWIW, saya mengajukan masalah tentang pesan error yang tidak jelas.

person CommonsWare    schedule 23.10.2017
comment
‹sigh› Jika kesalahan terjadi pada kelimanya, itu akan menghemat banyak waktu. Metode tersebut diterapkan di FolderDao, tapi saya rasa itu masih tidak berhasil (saya baru mengenal anotasi ajaib). Kalau dipikir-pikir, hal itu seharusnya tidak terlalu menjadi masalah. Saya awalnya memulai desain ini dengan pola pikir yang lebih berorientasi objek, tapi itu sulit dilakukan dengan Room. Dao yang cocok untuk semua untuk menangani semua relasi sama masuk akalnya dengan menangani masing-masing Entity satu per satu. Dalam hal ini semua kode dasar tetap dapat digunakan kembali. - person Anthony; 23.10.2017
comment
@Anthony: Metode tersebut diterapkan di FolderDao, tapi saya rasa itu masih tidak berhasil (saya baru mengenal anotasi magis) -- Saya tidak mendapatkan kesalahan itu saat menambahkan implementasi getPath() ke DAO saya. Versi Kamar apa yang Anda gunakan? Saya menguji dengan 1.0.0-rc1. - person CommonsWare; 23.10.2017
comment
beta2, saya akan mencoba meningkatkan. - person Anthony; 23.10.2017
comment
Salah satu subkelas menggunakan long bukan Long dan tidak ada getDatabase. Yang belum saya periksa dengan cermat. Model ini jelas tidak akan berhasil karena terlalu rentan terhadap kesalahan yang ambigu. - person Anthony; 23.10.2017

Bagi siapa pun yang menghadapi situasi serupa dengan logika kueri inti yang kompleks dengan 1.1.0 Room sekarang mengizinkan @RawQery yang memungkinkan Anda mengimplementasikan sendiri logika inti dengan rapi. Inilah cara saya menerapkan solusi khusus ini:

https://gist.github.com/rcketscientist/4ded9ae64a770ff6929f27b5dbdbe13a

person Anthony    schedule 09.02.2018