简体   繁体   中英

get data from sqlite database as livedata android

I have on app, now i want to update some parts of it using new android features. my database is SQLite and for some reason i can not use Room database. so i want to use viewmodel and live data in my app. problem is i cant how to get data from my db as Livedata. this is my code to get data from 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;
}

as u can see, i get data as a list of itema. now how can i get data as Livedata<List>. any help will be appreciated.

I think you can do something like this. Just return LiveData<<ArrayList<itema>> from the function and mutate it later in the background to reflect the result back.

for ex.

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

and where you are using just observer it.

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

Your should maintain a variable typed MutuableLiveData<ArrayList<itema>> in the viewmodel where you used it.

And update that livedata by post value from your db function getDataContact2 .

liveData.postValue(dbData)

Besides this you can create a livedata from the list in your db function getDataContact2 and return that if you really want to be .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM