0

im using sqlite with mvvm..but when i click add new and submit comming back to listing page it is not updated record in list.but when i kill app again come to list page it is showing record with duplicate entries of same record.i dont know where my code is getting wrong..plz help

db helper:-

public class DbHelper extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 2;

static final String DATABASE_NAME = "kuncorosqlite.db";

public static final String TABLE_SQLite = "sqlite";

public static final String COLUMN_ID = "id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_ADDRESS = "address";
ArrayList<HashMap<String, String>> listofMaps = new ArrayList();

public DbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    final String SQL_CREATE_MOVIE_TABLE = "CREATE TABLE " + TABLE_SQLite + " (" +
            COLUMN_ID + " INTEGER PRIMARY KEY autoincrement, " +
            COLUMN_NAME + " TEXT NOT NULL, " +
            COLUMN_ADDRESS + " TEXT NOT NULL" +
            " )";

    db.execSQL(SQL_CREATE_MOVIE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_SQLite);
    onCreate(db);
}

public MutableLiveData<ArrayList<HashMap<String, String>>> getAllData() {
    MutableLiveData<ArrayList<HashMap<String, String>>> wordList;
    wordList = new MutableLiveData<ArrayList<HashMap<String, String>>>();
    String selectQuery = "SELECT * FROM " + TABLE_SQLite;
    SQLiteDatabase database = this.getWritableDatabase();
    Cursor cursor = database.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put(COLUMN_ID, cursor.getString(0));
            map.put(COLUMN_NAME, cursor.getString(1));
            map.put(COLUMN_ADDRESS, cursor.getString(2));
            

            listofMaps.add(map);

            wordList.postValue(listofMaps);
        } while (cursor.moveToNext());
    }

    Log.e("select sqlite ", "" + wordList);

    database.close();
    return wordList;
}

public void insert(String name, String address) {
    SQLiteDatabase database = this.getWritableDatabase();
    String queryValues = "INSERT INTO " + TABLE_SQLite + " (name, address) " +
            "VALUES ('" + name + "', '" + address + "')";

    Log.e("insert sqlite ", "" + queryValues);
    database.execSQL(queryValues);
    database.close();
}

public void update(int id, String name, String address) {
    SQLiteDatabase database = this.getWritableDatabase();

    String updateQuery = "UPDATE " + TABLE_SQLite + " SET "
            + COLUMN_NAME + "='" + name + "', "
            + COLUMN_ADDRESS + "='" + address + "'"
            + " WHERE " + COLUMN_ID + "=" + "'" + id + "'";
    Log.e("update sqlite ", updateQuery);
    database.execSQL(updateQuery);
    database.close();
}

public void delete(int id) {
    SQLiteDatabase database = this.getWritableDatabase();

    String updateQuery = "DELETE FROM " + TABLE_SQLite + " WHERE " + COLUMN_ID + "=" + "'" + id + "'";
    Log.e("update sqlite ", updateQuery);
    database.execSQL(updateQuery);
    database.close();
}

}

viewmodel:-

public class Viewmodell extends AndroidViewModel {

private DbHelper repository ;
 MutableLiveData<ArrayList<HashMap<String, String>>> allNotesLivedata;
public Viewmodell(@NonNull Application application) {
    super(application);
    repository = new DbHelper(application);
    allNotesLivedata = repository.getAllData();
}
void insert(String name,String Address) {
    repository.insert(name,Address);
}
void update(int id, String name, String address) {
    repository.update(id,name,address);
}
void delete(int id) {
    repository.delete(id);
}
public LiveData<ArrayList<HashMap<String, String>>> getAllNotes() {
    return allNotesLivedata;
}

}

mainactivity (listing page):-

public class MainActivity extends AppCompatActivity {

ListView listView;
AlertDialog.Builder dialog;
List<Data> itemList = new ArrayList<Data>();
Adapter adapter;
DbHelper SQLite = new DbHelper(this);
Viewmodell viewmodell;
public static final String TAG_ID = "id";
public static final String TAG_NAME = "name";
public static final String TAG_ADDRESS = "address";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    SQLite = new DbHelper(getApplicationContext());
    viewmodell = ViewModelProviders.of(this).get(Viewmodell.class);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    listView = (ListView) findViewById(R.id.list_view);

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, AddEdit.class);
            startActivity(intent);
        }
    });

    adapter = new Adapter(MainActivity.this, itemList);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final String idx = itemList.get(position).getId();
            final String name = itemList.get(position).getName();
            final String address = itemList.get(position).getAddress();
            Intent intent = new Intent(MainActivity.this, DetailsAct.class);
            intent.putExtra(TAG_ID, idx);
            intent.putExtra(TAG_NAME, name);
            intent.putExtra(TAG_ADDRESS, address);
            startActivity(intent);
        }
    });

    getAllData();

}

private void getAllData() {
    viewmodell.getAllNotes();
    viewmodell.allNotesLivedata.observe(this, new Observer<ArrayList<HashMap<String, String>>>() {
        @Override
        public void onChanged(ArrayList<HashMap<String, String>> hashMaps) {
            for (int i = 0; i < hashMaps.size(); i++) {
                String id = hashMaps.get(i).get(TAG_ID);
                String poster = hashMaps.get(i).get(TAG_NAME);
                String title = hashMaps.get(i).get(TAG_ADDRESS);

                Data data = new Data();

                data.setId(id);
                data.setName(poster);
                data.setAddress(title);

                itemList.add(data);
            }

            adapter.notifyDataSetChanged();
        }


    });
}

@Override
protected void onResume() {
    super.onResume();
    itemList.clear();
    getAllData();
}
IRON MAN
  • 191
  • 3
  • 18

1 Answers1

1

Here I see you are having problems with LiveData.

Your LiveData seems to be having problems calling viewModel.getAllNotes() on the onResume() of your activity.

With you calling viewModel.getAllNote(), it actually returns LiveData, you don't set the value for that LiveData. That's why when you call viewModel.getAllNote() the LiveData allNotesLivedata is not triggered.

LiveData allNotesLivedata only actually triggers in Constructor of ViewModel via repository.getAllData(). repository.getAllData() is actually where you set the value for LiveData.

Replace the function getAllNotes() in the ViewModel in the following way:

public LiveData<ArrayList<HashMap<String, String>>> getAllNotes() {
    return repository.getAllData();
}

Edit 1:

I am seeing you have duplicate entity. it's onResume() that is called multiple times in the Activity's lifecycle.

And when you call onResume(), you call the function getAllData() in DbHelper. You are setting the value for LiveData to listofMap.

I see you are not resetting the old list, and you are adding each new item received from SQLite to the old list. That results in listofMap consisting of old item + new item of SQLite (includes all previous record + new record). So please reset listofMap before adding new item from SQLite.

public class DbHelper extends SQLiteOpenHelper {
    public MutableLiveData<ArrayList<HashMap<String, String>>> getAllData() {
        ...
        if (cursor.moveToFirst()) {
            listofMap = new ArrayList();
            // Continue your code
            do {
                ...
            }
        }
    }
}
Dương Minh
  • 2,062
  • 1
  • 9
  • 21