AndroidMVVM आर्किटेक्चर में LiveData सूची से पहला या (कोई भी) तत्व कैसे प्राप्त करें
यदि आप LiveData सूची से कोई विशेष तत्व प्राप्त करना चाहते हैं, तो आपको अपनी क्वेरी को ऑफ़सेट के साथ सीमित करना होगा।
डिफ़ॉल्ट रूप से किसी क्वेरी को सीमित करना उसके लिए ऑफ़सेट नहीं मानता है; इसलिए डिफ़ॉल्ट ऑफ़सेट मान 0 है.
उदाहरण के लिए, आपके Dao
. में :
उदाहरण 1 और 2 के नीचे दिए गए प्रश्न समतुल्य हैं, क्योंकि डिफ़ॉल्ट ऑफ़सेट मान 0 है।
उदाहरण
@Query("SELECT * FROM students LIMIT :limit")
LiveData<List<Student>> getStudents(int limit);
// Query
getStudents(1); // returns the first row of the list
उदाहरण 2
@Query("SELECT * FROM students LIMIT :limit OFFSET :offset")
LiveData<List<Student>> getStudents(int limit, int offset);
// Query
getStudents(1, 0); // returns the first row of the list
नोट: यहाँ मैं मान रहा हूँ कि आपका मॉडल वर्ग Student
है
यह पहली पंक्ति के बारे में है; लेकिन पंक्ति संख्या वापस करने के लिए x
तो आपको ऑफ़सेट में हेरफेर करने की आवश्यकता है:x-1
, क्योंकि ऑफ़सेट 0-आधारित मान है
उदाहरण 3 (उदाहरण 2 के समान दाओ क्वेरी)
getStudents(1, 1); // returns the second row
getStudents(1, 4); // returns the fifth row
यदि आप एक से अधिक पंक्तियों को वापस करना चाहते हैं, तो आपको LIMIT
में हेरफेर करने की आवश्यकता है मान, इसलिए वापस करने के लिए x
परिणामों से पंक्तियाँ, फिर क्वेरी को x
. के साथ सीमित करें ।
getStudents(2, 1); // returns the second and third rows
getStudents(3, 4); // returns the fifth, sixth, and seventh rows
आशा है कि यह आपके प्रश्न का समाधान करेगा
<ब्लॉकक्वॉट>टिप्पणियों के अनुसार संपादित करें
मेरे पास पहले से ही एक अन्य क्वेरी द्वारा लौटाई गई सूची है @Query("SELECT * FROM
students)
LiveData<List<Student>> getStudents();
तो लौटा मूल्य एक सूची है। मैं सूची से पहला तत्व प्राप्त करना चाहता हूं। यह उत्तर वास्तव में पहला तत्व देता है, लेकिन मुझे सभी चरणों को पारित करने की आवश्यकता है (इस विधि को ViewModel
में परिभाषित करने के लिए) MainActivity
. में कक्षा और निरीक्षण करें सूची या सूची में कोई तत्व प्राप्त करने के लिए)। मुझे रिपोजिटरी क्लास में फ़ंक्शन को मनोरंजक करते समय सूची में पहला मान टाइप करना है। -
अब आप निम्न क्वेरी का उपयोग कर रहे हैं
@Query("SELECT * FROM students")
LiveData<List<Student>> getStudents();
और आप चाहते हैं:
- सूची में पहला या कोई तत्व प्राप्त करें। और ऊपर बताए गए अनुसार ऐसा करने के लिए
- सभी चरणों को पास करें (इस पद्धति को
ViewModel
. में परिभाषित करने के लिए इसेMainActivity
. में क्लास करके देखें सूची या सूची में कोई भी तत्व प्राप्त करने के लिए)।
तो ऐसा करने के लिए:
दाओ में: :अपनी क्वेरी को
. में बदलें@Query("SELECT * FROM students LIMIT :limit OFFSET :offset")
LiveData<List<Student>> getAllStudents(int limit, int offset);
भंडार में:
public class StudentRepository {
...
public LiveData<List<Student>> getAllStudents(final int limit, final int offset) {
return mDAO.getAllStudents(limit, offset);
}
}
व्यूमॉडल में:
public LiveData<List<Student>> getAllStudents(final int limit, final int offset) {
return mRepository.getAllStudents(limit, offset);
}
गतिविधि में:
private void getAllStudents(int limit, int offset) {
mViewModel.getAllStudents(limit, offset).observe(this, new Observer<List<Student>>() {
@Override
public void onChanged(List<Student> students) {
if (students != null) {
// Here you can set RecyclerView list with `students` or do whatever you want
}
}
});
}
और इसका परीक्षण करने के लिए:
getAllStudents(1, 0); // return first row from the table.
getAllStudents(2, 0); // return first 2 rows from the table.
getAllStudents(2, 1); // return 2nd and 3rd rows from the table.
getAllStudents(-1, 5); // remove first 5 rows from the table.
और Log.d में पहला छात्र नाम टाइप करने के लिए mAllStudents सूची में पहला तत्व वापस करने के लिए
तो, आपकी गतिविधि में
mViewModel.getAllStudents(1, 0).observe(this, new Observer<List<Student>>() {
@Override
public void onChanged(List<Student> students) {
if (students != null) {
Student student = students.get(0);
Log.d("First_Name", student.getName());
}
}
});
<ब्लॉकक्वॉट> संपादित करें क्या सभी चरणों का पालन किए बिना सूची के किसी भी तत्व को वापस करना संभव है जैसे कि व्यूमोडेल में एक फ़ंक्शन लिखना और मुख्य गतिविधि में निरीक्षण करना? मेरा प्रश्न सभी चरणों का पालन करने का नहीं है।
हाँ यह संभव है, लेकिन उपरोक्त मॉडल Google द्वारा अनुशंसित मॉडल है, आप एक List<Student>
वापस कर सकते हैं Dao
. से LiveData<List<Student>>
. के बजाय क्वेरी , लेकिन बुरी खबर ये हैं:
- आपको इसे एक अलग बैकग्राउंड थ्रेड में हैंडल करना होगा; क्योंकि
LiveData
इसे मुफ्त में करें। - आप
LiveData
. का मान खो देंगे; इसलिए आपको किसी भी अपडेट की जांच के लिए सूची को मैन्युअल रूप से रीफ्रेश करना होगा क्योंकि आप पर्यवेक्षक पैटर्न का उपयोग करने में सक्षम नहीं होंगे।
तो, आप ViewModel
. का उपयोग करके छोड़ सकते हैं और Repository
, और गतिविधि से सभी चीजें निम्नानुसार करें:
private Executor mExecutor = Executors.newSingleThreadExecutor();
public void getAllStudents(final int limit, final int offset) {
final StudentDAO mDAO = StudentDatabase.getInstance(getApplicationContext()).getStudentDAO();
mExecutor.execute(new Runnable() {
@Override
public void run() {
List<Student> students = mDAO.getAllStudents(limit, offset);
Student student = students.get(0);
Log.d("First_Name", student.getName());
}
});
}
// Usage: getAllStudents(1, 0);
और दाओ के लिए प्रश्न:
@Query("SELECT * FROM students LIMIT :limit OFFSET :offset")
List<Student> getAllStudents(int limit, int offset);