SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

làm cách nào để lấy phần tử đầu tiên hoặc (bất kỳ) từ Danh sách LiveData trong kiến ​​trúc MVVM của Android?

cách lấy phần tử đầu tiên hoặc (bất kỳ) từ Danh sách LiveData trong kiến ​​trúc AndroidMVVM

Nếu bạn muốn lấy một phần tử cụ thể từ danh sách LiveData, thì bạn cần giới hạn truy vấn của mình bằng một phần bù.

Theo mặc định, giới hạn một truy vấn không coi là một phần bù cho nó; vì vậy giá trị bù mặc định là 0.

Ví dụ:trong Dao của bạn :

Các truy vấn dưới đây của Ví dụ 1 &2 là tương đương, vì giá trị bù mặc định là 0.

Ví dụ

@Query("SELECT * FROM students LIMIT  :limit")
LiveData<List<Student>> getStudents(int limit);

// Query
getStudents(1); // returns the first row of the list

Ví dụ 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

Lưu ý: Ở đây tôi giả sử lớp mô hình của bạn là Student

Đây là về hàng đầu tiên; nhưng để trả về số hàng x thì bạn cần thao tác bù đắp thành: x-1 , vì phần bù là giá trị dựa trên 0

Ví dụ 3 (Truy vấn Dao tương tự như Ví dụ 2)

getStudents(1, 1); // returns the second row
getStudents(1, 4); // returns the fifth row

Nếu bạn muốn trả về nhiều hơn một hàng, thì bạn cần phải thao tác LIMIT giá trị, vì vậy để trả về x các hàng từ kết quả, sau đó giới hạn truy vấn bằng x .

getStudents(2, 1); // returns the second and third rows
getStudents(3, 4); // returns the fifth, sixth, and seventh rows

Hy vọng điều này giải quyết câu hỏi của bạn

Chỉnh sửa theo nhận xét

Tôi đã có một danh sách được trả về bởi một truy vấn khác @Query("SELECT * FROM students) LiveData<List<Student>> getStudents(); Vì vậy, giá trị trả về là một danh sách. Tôi muốn lấy phần tử đầu tiên từ danh sách. Câu trả lời này trả về phần tử đầu tiên thực sự, nhưng tôi cần phải vượt qua tất cả các bước (để xác định phương thức này trong ViewModel lớp và quan sát trong MainActivity để lấy danh sách hoặc bất kỳ phần tử nào trong danh sách). Những gì tôi cần là nhập giá trị đầu tiên trong danh sách trong khi tôi đang sử dụng hàm trong lớp kho lưu trữ. -

Bây giờ bạn đang sử dụng truy vấn bên dưới

@Query("SELECT * FROM students")
LiveData<List<Student>> getStudents();

Và bạn muốn:

  1. Lấy phần tử đầu tiên hoặc bất kỳ phần tử nào trong danh sách. và để làm như vậy theo điều đã được đề cập ở trên
  2. Vượt qua tất cả các bước (để xác định phương pháp này trong ViewModel và quan sát nó trong MainActivity để lấy danh sách hoặc bất kỳ thành phần nào trong danh sách).

Vì vậy, để làm điều đó:

Trong tiếng Dao: :Thay đổi truy vấn của bạn thành

@Query("SELECT * FROM students LIMIT  :limit OFFSET :offset")
LiveData<List<Student>> getAllStudents(int limit, int offset);

Trong kho lưu trữ:

public class StudentRepository {

    ...

    public LiveData<List<Student>> getAllStudents(final int limit, final int offset) {
        return mDAO.getAllStudents(limit, offset);
    }
}

Trong ViewModel:

public LiveData<List<Student>> getAllStudents(final int limit, final int offset) {
    return mRepository.getAllStudents(limit, offset);
}

Đang hoạt động:

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

            }
        }
    });
}

Và để kiểm tra điều đó:

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.

Và để trả về phần tử đầu tiên trong danh sách mAllStudents để nhập tên sinh viên đầu tiên vào Nhật ký. d

Vì vậy, trong hoạt động của bạn

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());
        }
    }
});

Chỉnh sửa có thể trả về bất kỳ phần tử nào của danh sách mà không cần làm theo tất cả các bước như viết một hàm trong ViewModeland quan sát trong MainActivity không? Câu hỏi của tôi là không làm theo tất cả các bước.

Có, có thể, nhưng mô hình trên là mô hình được đề xuất bởi Google, Bạn có thể trả về một List<Student> từ Dao truy vấn thay vì LiveData<List<Student>> , nhưng tin xấu là:

  1. Bạn phải xử lý điều đó trong một chuỗi nền riêng biệt; bởi vì LiveData làm điều đó miễn phí.
  2. Bạn sẽ mất giá trị của LiveData; vì vậy bạn phải làm mới danh sách theo cách thủ công để kiểm tra bất kỳ bản cập nhật nào vì bạn sẽ không thể sử dụng mẫu quan sát.

Vì vậy, bạn có thể bỏ qua việc sử dụng ViewModelRepository và thực hiện tất cả các nội dung từ hoạt động như sau:

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);

Và truy vấn cho Dao:

@Query("SELECT * FROM students LIMIT  :limit OFFSET :offset")
List<Student> getAllStudents(int limit, int offset);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android - Con trỏ trênMapReady (Điểm đánh dấu)

  2. Làm cách nào để viết SQLite Real vals sang các giá trị BigDecimal của Java?

  3. Cách nhận giá trị tối đa của số nguyên kiểu cột được lưu trữ dưới dạng văn bản kiểu trong bảng sqlite

  4. Làm cách nào để truy xuất tất cả các hàng trong DB của tôi?

  5. Trả về danh sách cơ sở dữ liệu trong SQLite