Pertanyaan Ruang Android: Bagaimana cara memodelkan hubungan?


Saya baru saja mulai bekerja dengan Room dan meskipun semuanya tampak cukup intuitif, saya saat ini tidak benar-benar mengerti bagaimana tepatnya saya bisa menangani hubungan.

Karena SQLite adalah basis data relasional, Anda dapat menentukan hubungan antar objek. Meskipun sebagian besar pustaka ORM mengizinkan objek entitas untuk mereferensikan satu sama lain, Ruang secara eksplisit melarang ini. Meskipun Anda tidak dapat menggunakan hubungan langsung, Ruang tetap memungkinkan Anda mendefinisikan batasan Kunci Asing antar entitas. (Sumber: https://developer.android.com/topic/libraries/architecture/room.html#no-object-references)

  1. Bagaimana seharusnya Anda memodelkan Banyak ke banyak atau Satu ke Banyak Hubungan?
  2. Apa yang akan terlihat seperti ini dalam praktik (contoh DAO + Entitas)?

18
2018-05-19 12:16


asal


Jawaban:


Kamu dapat memakai @Relation anotasi untuk menangani hubungan di Kamar.

Anotasi kenyamanan yang dapat digunakan dalam Pojo untuk secara otomatis   ambil entitas relasi. Ketika Pojo dikembalikan dari kueri, semua   relasinya juga diambil oleh Room.

Lihat dokumen.

(Dokumen Google memiliki contoh yang membingungkan. Saya telah menulis langkah-langkah dan beberapa penjelasan dasar pada jawaban saya yang lain. Anda bisa coba lihat)


18
2018-06-07 23:19



Saya membuat Metode Kemudahan sederhana yang mengisi secara manual hubungan satu ke banyak. Jadi misalnya jika Anda memiliki satu hingga banyak di antara Negara dan Kota, Anda dapat menggunakan metode untuk secara manual mengisi properti cityList di Negara.

/**
 * @param tableOne The table that contains the PK. We are not using annotations right now so the pk should be exposed via a getter getId();
 * @param tableTwo The table that contains the FK. We are not using annotations right now so the Fk should be exposed via a getter get{TableOneName}Id(); eg. getCountryId();
 * @param <T1>     Table One Type
 * @param <T2>     Table Two Type
 * @throws NoSuchFieldException
 * @throws IllegalAccessException
 * @throws NoSuchMethodException
 * @throws InvocationTargetException
 */
private static <T1, T2> void oneToMany(List<T1> tableOne, List<T2> tableTwo) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

    String tableOneName = tableOne.get(0).getClass().getSimpleName();
    String tableTwoName = tableTwo.get(0).getClass().getSimpleName();
    for (T1 t1 :
            tableOne) {
        Method method = t1.getClass().getMethod("getId");
        Integer pkId = (Integer) method.invoke(t1);
        List<T2> listForCurrentId = new ArrayList<>();
        for (T2 t2 : tableTwo) {
            Method fkMethod = t2.getClass().getDeclaredMethod("get".concat(tableOneName).concat("Id"));
            Integer fkId = (Integer) fkMethod.invoke(t2);
            if (pkId == fkId) {
                listForCurrentId.add(t2);
            }
        }
        Method tableTwoList = t1.getClass().getMethod("set".concat(tableTwoName).concat("List"), List.class);
        tableTwoList.invoke(t1, listForCurrentId);
    }
}

Beginilah cara saya menggunakannya.

   SystemDefaults systemDefaults = new SystemDefaults();
    return Single.zip(systemDao.getRoles(), systemDao.getCountries(), systemDao.getCities(), (roles, countries, cities) -> {
        systemDefaults.setRoles(roles);
        *ConvenienceMethods.oneToMany(countries,cities);*
        systemDefaults.setCountries(countries);
        return systemDefaults;
    });

-2
2017-09-10 07:22