Bagaimana cara memasukkan nama kolom sebagai parameter dalam database ruangan? [duplikat]

Dec 11 2020

Saya menggunakan roomdatabasedan saya memiliki banyak kategori untuk ditanyakan.

@Query("SELECT * FROM Table_name WHERE sweets = 1")
LiveData<List<Item>> getAllSweets();

@Query("SELECT * FROM Table_name WHERE drinks = 1")
LiveData<List<Item>> getAllDrinks();

Jadi pertanyaannya adalah, apakah mungkin membuat satu kueri universal dan melewatkan nama kolom sebagai parameter? Sebagai contoh:

@Query("SELECT * FROM Table_name WHERE :columnname = drinks AND :columnname = 1")
LiveData<List<Item>> getAllDrinks(String drinks); 

Saya tahu bahwa saya merujuk ke nama kolom tetapi Jika nama kolom adalah tipe int, seharusnya tidak?

LiveData<List<Item>> getAllDrinks(int drinks)

Jawaban

Zain Dec 11 2020 at 22:23

Jawaban Singkat: Anda tidak dapat melakukan itu karena SQLite tidak mengizinkannya, periksa di sini .

Jawaban panjang:

Ada beberapa kekurangan dalam model Anda:

  1. Model Desain Basis Data: Bukan desain basis data yang baik dalam hal normalisasi data ; Mengapa? Anda memiliki kolom untuk sweets, satu lagi untuk drinks, mungkin satu untuk meals.. Lebih banyak kolom, berarti lebih banyak penyimpanan data, lebih banyak bidang kosong dalam catatan, dan Anda memerlukan metode database untuk menanyakan setiap kolom secara terpisah (seperti pertanyaan Anda tentang apa)
  2. Agar nama kolom variabel dapat rawan kesalahan: bagaimana jika Anda mengirimkan kolom yang tidak ada dalam database .. Ini adalah salah satu fitur yang Roommemberikan Anda secara abstrak di SQL queriesmana Room memberi Anda kesalahan waktu kompilasi untuk nama kolom yang salah sementara SQLite normal memunculkannya saat runtime.

Apa yang saya anjurkan untuk Anda lakukan:

Buat satu kolom yang menunjukkan jenis makanan; untuk efisiensi, Anda dapat membuatnya dari jenis int, dan memetakan setiap nilai bilangan bulat ke jenis makanan tertentu:

1 >> goes for >> sweats 
2 >> goes for >> drinks
and so on..

Sekarang Anda memiliki satu kolom (bukan beberapa dari mereka seperti dalam model Anda) Sekarang Anda dapat memiliki satu metode DAO yang mengakses tipe apa pun (yang Anda minta)

@Query("SELECT * FROM Table_name WHERE :foodtype = type")
LiveData<List<Item>> getAllDrinks(int type) // add the type

Catatan: Juga agar terbaca, Anda dapat menggunakan Enums untuk bidang Anda dan membuat konversi tipe Kamar.