कमरे के डेटाबेस में एक पैरामीटर के रूप में कॉलम नाम कैसे पास करें? [डुप्लिकेट]

Dec 11 2020

मैं उपयोग कर roomdatabaseरहा हूं और मेरे पास क्वेरी करने के लिए बहुत सी श्रेणियां हैं।

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

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

तो सवाल यह है कि, एक सार्वभौमिक क्वेरी बनाना और कॉलम नाम को पैरामीटर के रूप में पारित करना संभव है? उदाहरण के लिए:

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

मुझे पता है कि मैं कॉलमनाम का उल्लेख करता हूं लेकिन यदि कॉलमनाम टाइप है तो intयह नहीं होना चाहिए?

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

जवाब

Zain Dec 11 2020 at 22:23

संक्षिप्त उत्तर: आप ऐसा नहीं कर सकते क्योंकि SQLite की अनुमति नहीं है, यहाँ देखें ।

लंबा जवाब:

आपके मॉडल में कुछ कमियां हैं:

  1. डेटाबेस डिज़ाइन मॉडल: डेटा सामान्यीकरण के संदर्भ में एक अच्छा डेटाबेस डिज़ाइन नहीं ; क्यों? आपके पास एक कॉलम है sweets, दूसरे के लिए drinks, शायद एक के लिए meals.. अधिक कॉलम, अधिक डेटा स्टोरेज, रिकॉर्ड में अधिक अशक्त-सक्षम फ़ील्ड, और आपको प्रत्येक कॉलम को अलग से क्वेरी करने के लिए डेटाबेस विधि की आवश्यकता है (जैसे कि आपका प्रश्न क्या है)
  2. एक चर स्तंभ नाम में त्रुटि हो सकती है: यदि आप डेटाबेस में मौजूद नहीं हैं तो क्या होगा .. यह उन विशेषताओं में से एक है जो Roomआपको ऐसे सार SQL queriesप्रदान करता है जहां कक्ष आपको एक संकलन-समय की त्रुटि प्रदान करता है सामान्य SQLite गलत कॉलम नाम उन्हें रनटाइम पर उठाता है।

मैं आपको क्या करने के लिए प्रोत्साहित करता हूं:

एक एकल स्तंभ बनाएं जो भोजन के प्रकार को इंगित करता है; दक्षता के लिए आप इसे टाइप कर सकते हैं int, और प्रत्येक पूर्णांक मान को एक निश्चित प्रकार के भोजन में मैप कर सकते हैं :

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

अब आपके पास एक एकल कॉलम है (आपके मॉडल में उनमें से कई नहीं) अब आप किसी भी प्रकार (जो आप के लिए पूछ रहे थे) तक पहुँचने के लिए एक एकल DAO विधि हो सकती है

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

नोट: पठनीयता के लिए भी आप Enumअपने खेतों के लिए उपयोग कर सकते हैं और रूम टाइप रूपांतरण कर सकते हैं।