sql >> Database >  >> RDS >> SQLite

hoe het eerste of (een) element van een LiveData-lijst in Android MVVM-architectuur te krijgen?

hoe het eerste of (een) element uit een LiveData-lijst in AndroidMVVM-architectuur te krijgen

Als u een bepaald element uit een LiveData-lijst wilt halen, moet u uw zoekopdracht beperken met een offset.

Het beperken van een query houdt standaard geen rekening met een offset ervan; dus de standaard offsetwaarde is 0.

Bijvoorbeeld in uw Dao :

De onderstaande zoekopdrachten van Voorbeeld 1 &2 zijn equivalent, omdat de standaard offsetwaarde 0 is.

Voorbeeld

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

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

Voorbeeld 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

Opmerking: Hier neem ik aan dat je modelklasse Student is

Dit gaat over de eerste rij; maar om rijnummer x terug te geven dan moet je de offset manipuleren om:x-1 . te zijn , aangezien de offset een op 0 gebaseerde waarde is

Voorbeeld 3 (Dezelfde Dao-query als Voorbeeld 2)

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

Als u meer dan één rij wilt retourneren, moet u de LIMIT . manipuleren waarde, dus om x . terug te geven rijen uit de resultaten en beperk vervolgens de zoekopdracht met x .

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

Ik hoop dat dit je vraag beantwoordt

Bewerken volgens opmerkingen

Ik heb al een lijst geretourneerd door een andere zoekopdracht @Query("SELECT * FROM students) LiveData<List<Student>> getStudents(); Dus de geretourneerde waarde is een lijst. Ik wil het eerste element uit de lijst halen. Dit antwoord geeft het eerste element echt terug, maar ik moet alle stappen doorlopen (om deze methode te definiëren in de ViewModel class en observeer het in de MainActivity om de lijst of enig element in de lijst te krijgen). Wat ik nodig heb, is om de eerste waarde in de lijst te typen terwijl ik de functie in de repository-klasse amuseer. –

Nu gebruikt u onderstaande zoekopdracht

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

En je wilt:

  1. Verkrijg het eerste of een willekeurig element in de lijst. en om dit te doen volgens wat hierboven is vermeld
  2. Volg alle stappen (om deze methode te definiëren in het ViewModel classen observeren in de MainActivity om de lijst of enig element in de lijst te krijgen).

Dus om dat te doen:

In Dao: :verander uw zoekopdracht in

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

In opslag:

public class StudentRepository {

    ...

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

In ViewModel:

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

In activiteit:

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

            }
        }
    });
}

En om dat te testen:

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.

En om het eerste element in de mAllStudents-lijst terug te geven om de eerste studentnaam in de Log.d te typen

Dus, in je activiteit

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

Bewerken is het mogelijk om elk element van de lijst te retourneren zonder alle stappen te volgen, zoals het schrijven van een functie in ViewModeland en observeren in de MainActivity? Mijn vraag is om niet alle stappen te volgen.

Ja, het is mogelijk, maar het bovenstaande model is het door Google aanbevolen model. U kunt een List<Student> retourneren van Dao query in plaats van LiveData<List<Student>> , maar het slechte nieuws is:

  1. Je moet dat afhandelen in een aparte achtergrondthread; omdat deLiveData doe dat gratis.
  2. Je verliest de waarde van de LiveData; dus je moet de lijst handmatig vernieuwen om een ​​update te controleren, omdat je het waarnemerpatroon niet kunt gebruiken.

U kunt dus weglaten met behulp van ViewModel en Repository , en doe alle dingen van de activiteit als volgt:

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

En de vraag voor de Dao:

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



  1. MySQL-back-up- en herstelopdrachten voor databasebeheer

  2. SQL-opdracht om alle databases in MySQL en MariaDB weer te geven en weer te geven

  3. Hoe twee schema's in PostgreSQL te vergelijken?

  4. Hoe kan ik invoegen in een BLOB-kolom vanuit een insert-instructie in sqldeveloper?