Saat ini saya sedang mengerjakan aplikasi pencatat yang mengikuti arsitektur MVVM. ada 2 kegiatan. Main dengan daftar catatan dan mode tampilan yang memungkinkan pengguna untuk melihat catatan. Jika mereka mengklik deskripsi atau judul, itu memungkinkan mode edit di mana Anda dapat menyimpan perubahan dan apa yang tidak. Saat catatan baru sedang dibuat, pengguna akan dibawa ke aktivitas yang sama untuk melihat/mengedit catatan dan mengaktifkan mode edit dengan judul dan deskripsi kosong. Masalah yang saya alami saat ini adalah jika pengguna membuat catatan dan memutuskan untuk mengeditnya tepat setelah dibuat, ketika pengguna kembali ke daftar catatan, ia memiliki banyak catatan yang masing-masing berisi setiap pembaruan yang dibuatnya. catatan disimpan ke catatan baru alih-alih memperbarui yang sudah ada.

Kode untuk menyimpan catatan:

private void saveNote(){

        //updates existing note. Next Statement adds new note
        if(getIntent().hasExtra(EXTRA_ID)){
            mViewTitle.setText(mEditTitle.getText().toString());
            String timeStamp = Utility.getCurrentTimestamp();
            timeStamp = timeStamp.replace("-", " ");

            Note note = new Note(mTitle, mContent, timeStamp);
            note.setId(mID);
            mAddEditNoteViewModel.update(note);
            Toast.makeText(this, "Note Updated", Toast.LENGTH_SHORT).show();
        } else if(!getIntent().hasExtra(EXTRA_ID)){
            mViewTitle.setText(mEditTitle.getText().toString());
            String timeStamp = Utility.getCurrentTimestamp();
            timeStamp = timeStamp.replace("-", " ");

            Note note = new Note(mTitle, mContent, timeStamp);
            mAddEditNoteViewModel.insert(note);
            Toast.makeText(this, "New Note Created:", Toast.LENGTH_SHORT).show();
        }
    }

Seperti yang Anda lihat, Cara saya memeriksa apakah saya perlu memperbarui atau membuat catatan baru adalah dengan memeriksa apakah maksud memiliki data yang saya butuhkan (dalam hal ini ID). Tetapi ketika pengguna baru saja membuat catatan dan tidak kembali ke aktivitas utama, setiap kali catatan yang baru dibuat diperbarui tanpa kembali ke main akan memanggil pernyataan else if sehingga membuat catatan baru. Sepertinya saya tidak dapat menemukan cara untuk menyiasatinya. Saya berpikir untuk hanya menyimpan catatan baru SETELAH pengguna kembali ke aktivitas utama tetapi jika pengguna membuat catatan, mengklik ikon tanda centang (untuk menyimpan) dan menutup aplikasi tanpa kembali ke utama, catatan tidak akan diselamatkan. Bagaimana saya bisa mendekati masalah ini?

0
user1693251 8 Januari 2020, 21:34

2 jawaban

Jawaban Terbaik

Saya bisa mendapatkan hasil yang saya inginkan dengan melakukan hal berikut:

Di repositori saya, saya mengembalikan long dengan metode get yang mengembalikan id yang dikembalikan dalam metode doInBackground dari asynctask dan tidak seperti sebelumnya (di mana do in background terjadi setelah hasil dari insert dikirimkan (null)) hasilnya tidak dikirimkan hingga doInBackground berjalan:

 public Long insert(Note note) {
        try {
            Long id = new InsertNoteAsyncTask(mNoteDao).execute(note).get();
            Log.d(TAG, "insert: CALLED - REPOSITORY - LONG: " + id);
            return id;
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

Maka model tampilan baru saja mendapatkan dan mengembalikan yang panjang

public Long insert(Note note) {
    return mNoteRepository.insert(note);
}

Dan semuanya berjalan seperti yang diharapkan. Terima kasih banyak kepada @Tenfour04 atas bantuannya

0
user1693251user1693251 11 Januari 2020, 16:19

Jika saya mengerti dengan benar, Anda menggunakan keberadaan EXTRA_ID untuk menentukan apakah catatan yang sedang diedit sudah ada.

Tapi apa arti kehadiran EXTRA_ID sebenarnya adalah bahwa Aktivitas dibuka dengan instruksi untuk memuat ID yang ada.

Jadi ini bukan dua arti yang setara dan Anda tidak boleh menggunakan EXTRA_ID sebagai pengujian Anda tentang apakah akan menyimpan catatan baru.

Ada banyak cara untuk menyelesaikan ini. Apa yang akan saya lakukan adalah mengubah mID menjadi mSavedNoteId dan menjadikannya Integer atau Long nullable daripada int atau long. (Tidak yakin mana yang Anda gunakan.) Biarkan nilai null menunjukkan bahwa Anda tidak bekerja dengan catatan yang disimpan. Saat aktivitas terbuka, Anda dapat menetapkan nilai mSavedNoteId berdasarkan ekstra, atau membiarkannya sebagai null jika tidak ada tambahan. Hanya buat nomor ID dan tetapkan ke mSavedNoteId saat pertama kali disimpan. Dan akhirnya, pernyataan if Anda dapat memeriksa apakah mSavedNoteId null atau tidak untuk menentukan apakah catatan baru harus disimpan atau yang sudah ada diperbarui.

private void saveNote() {
    mViewTitle.setText(mEditTitle.getText().toString());
    String timeStamp = Utility.getCurrentTimestamp().replace("-", " ");
    Note note = new Note(mTitle, mContent, timeStamp);
    if (mSavedNoteId != null){
        note.setId(mSavedNoteId);
        mAddEditNoteViewModel.update(note);
        Toast.makeText(this, "Note Updated", Toast.LENGTH_SHORT).show();
    } else {
        mSavedNoteId = generateNewNoteId(); // however you're doing it
        note.setId(mSavedNoteId);
        mAddEditNoteViewModel.insert(note);
        Toast.makeText(this, "Note Updated", Toast.LENGTH_SHORT).show();
    } 
}

Saya kira mungkin implementasi model tampilan Anda yang menghasilkan ID saat Anda memanggil insert(). Dalam hal ini, buat insert() kembalikan ID yang dihasilkan dan ubah cabang else seperti ini:

mSavedNoteId = mAddEditNoteViewModel.insert(note);
Toast.makeText(this, "Note Updated", Toast.LENGTH_SHORT).show();
0
Tenfour04 8 Januari 2020, 20:10