получить данные из базы данных sqlite как liveata android - PullRequest
1 голос
/ 08 октября 2019

У меня есть приложение, теперь я хочу обновить некоторые его части, используя новые функции Android. моя база данных SQLite и по какой-то причине я не могу использовать базу данных Room. поэтому я хочу использовать viewmodel и живые данные в моем приложении. Проблема в том, что я не могу получить данные из моей базы данных в качестве Livedata. это мой код для получения данных из db:

public ArrayList<itema> getDataContact2 () {

    SQLiteDatabase db = myhelper.getReadableDatabase();
    String[] columns = {DBhelper.CONID,DBhelper.CONNAME, DBhelper.PHONE1, DBhelper.PHONE3, DBhelper.ADDRESS, DBhelper.TELEGRAM,DBhelper.INSTAGRAM,DBhelper.PHONE2,DBhelper.IMAGE,DBhelper.INFO,DBhelper.WHATSUP,DBhelper.EMAIL,DBhelper.EVENT,DBhelper.EVENTTITLE};
    Cursor cursor = db.query(DBhelper.TABLE_CONTACT, columns, null, null, null, null, DBhelper.CONNAME);
    ArrayList<itema> myList=new ArrayList<>();


    while (cursor.moveToNext()) {
       try {
           int id = cursor.getInt(cursor.getColumnIndex(DBhelper.CONID));
           String name = cursor.getString(cursor.getColumnIndex(DBhelper.CONNAME));
           String phone1 = cursor.getString(cursor.getColumnIndex(DBhelper.PHONE1));
           String phone2 = cursor.getString(cursor.getColumnIndex(DBhelper.PHONE2));
           String phone3 = cursor.getString(cursor.getColumnIndex(DBhelper.PHONE3));
           String add = cursor.getString(cursor.getColumnIndex(DBhelper.ADDRESS));
           String date = cursor.getString(cursor.getColumnIndex(DBhelper.EVENT));
           String telegram = cursor.getString(cursor.getColumnIndex(DBhelper.TELEGRAM));
           String insta = cursor.getString(cursor.getColumnIndex(DBhelper.INSTAGRAM));
           String whatsup = cursor.getString(cursor.getColumnIndex(DBhelper.WHATSUP));
           String email = cursor.getString(cursor.getColumnIndex(DBhelper.EMAIL));
           String info = cursor.getString(cursor.getColumnIndex(DBhelper.INFO));
           String image = cursor.getString(cursor.getColumnIndex(DBhelper.IMAGE));
           String datetitle = cursor.getString(cursor.getColumnIndex(DBhelper.EVENTTITLE));
           itema item=new itema(id,name,phone1,phone2,phone3,add,email,insta,telegram,whatsup,image,info,date,datetitle);

           myList.add(item);
       }
       catch (Exception e){
           e.printStackTrace();
       }

    }
    cursor.close();
    return myList;
}

, как вы можете видеть, я получаю данные в виде списка итераций. Теперь, как я могу получить данные как Livedata>. любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вы должны поддерживать переменную, набранную MutuableLiveData<ArrayList<itema>> в модели представления, в которой вы ее использовали.

И обновлять эти жилпаты по почтовому значению из вашей функции db getDataContact2 .

liveData.postValue(dbData)

Кроме того, вы можете создать из списка в вашей функции db функцию liveata getDataContact2 и вернуть , если вы действительно хотите быть .

1 голос
/ 08 октября 2019

Я думаю, вы можете сделать что-то подобное. Просто верните LiveData<<ArrayList<itema>> из функции и измените ее позже в фоновом режиме, чтобы отразить результат обратно.

для примера.

    public LiveData<ArrayList<itema> getDataContact2 () {

    LiveData<ArrayList<itema>> resultList = MutableLiveData<List<itema>>();

    //use some background thread to get data from Sqlite here below......
    SQLiteDatabase db = myhelper.getReadableDatabase();
    String[] columns = {DBhelper.CONID,DBhelper.CONNAME, DBhelper.PHONE1, DBhelper.PHONE3, DBhelper.ADDRESS, DBhelper.TELEGRAM,DBhelper.INSTAGRAM,DBhelper.PHONE2,DBhelper.IMAGE,DBhelper.INFO,DBhelper.WHATSUP,DBhelper.EMAIL,DBhelper.EVENT,DBhelper.EVENTTITLE};
    Cursor cursor = db.query(DBhelper.TABLE_CONTACT, columns, null, null, null, null, DBhelper.CONNAME);
    ArrayList<itema> myList=new ArrayList<>();


    while (cursor.moveToNext()) {
       try {
           int id = cursor.getInt(cursor.getColumnIndex(DBhelper.CONID));
           String name = cursor.getString(cursor.getColumnIndex(DBhelper.CONNAME));
           String phone1 = cursor.getString(cursor.getColumnIndex(DBhelper.PHONE1));
           String phone2 = cursor.getString(cursor.getColumnIndex(DBhelper.PHONE2));
           String phone3 = cursor.getString(cursor.getColumnIndex(DBhelper.PHONE3));
           String add = cursor.getString(cursor.getColumnIndex(DBhelper.ADDRESS));
           String date = cursor.getString(cursor.getColumnIndex(DBhelper.EVENT));
           String telegram = cursor.getString(cursor.getColumnIndex(DBhelper.TELEGRAM));
           String insta = cursor.getString(cursor.getColumnIndex(DBhelper.INSTAGRAM));
           String whatsup = cursor.getString(cursor.getColumnIndex(DBhelper.WHATSUP));
           String email = cursor.getString(cursor.getColumnIndex(DBhelper.EMAIL));
           String info = cursor.getString(cursor.getColumnIndex(DBhelper.INFO));
           String image = cursor.getString(cursor.getColumnIndex(DBhelper.IMAGE));
           String datetitle = cursor.getString(cursor.getColumnIndex(DBhelper.EVENTTITLE));
           itema item=new itema(id,name,phone1,phone2,phone3,add,email,insta,telegram,whatsup,image,info,date,datetitle);

           myList.add(item);
       }
       catch (Exception e){
           e.printStackTrace();
       }

    }
    cursor.close();
    resultList.postValue(myList)
    //some background operation end here 

    return resultList;
}

и где вы используете просто наблюдать это.

getDataContact2().observe(this, Observer<List<itema>>{ it->
  //some action on change of data
})
...