我目前正在开发一个遵循MVVM架构的笔记应用程序。有2个活动。主要带有注释列表和查看模式,允许用户查看注释。如果他们单击描述或标题,则允许编辑模式,您可以在其中保存更改,而不能保存更改。创建新便笺时,会将用户带到相同的活动来查看/编辑便笺,并启用带有空标题和描述的编辑模式。目前的问题是,如果用户创建了一个便笺并决定在创建后立即对其进行编辑,则当用户返回到便笺列表时,便会有一堆便笺,每个便笺都包含他所做的每个更新,因此便笺将被保存到新便笺中,而不是更新现有便笺。

保存注释的代码:

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


如您所见,我检查是否需要更新或创建新便笺的方式是通过检查意图是否包含我需要的数据(在本例中为ID)。但是,当用户只是创建便笺而没有返回主活动时,每次新创建的便笺得到更新而又不返回主便会调用else if语句,从而创建一个新便笺。我似乎找不到解决此问题的方法。我本来只是想在用户返回主活动后保存新便笺,但是如果用户创建便笺,单击对勾图标(以保存)并关闭应用程序而不返回主便笺,便不会保存。我该如何解决这个问题?

最佳答案

如果我理解正确,则说明您正在使用EXTRA_ID来确定当前正在编辑的注释是否已经存在。

但是EXTRA_ID的存在真正的意思是,活动是通过加载现有ID的指令打开的。

因此,这不是两个等效的含义,您不应该使用EXTRA_ID作为是否保存新笔记的测试。

有很多解决方法。我要做的是将mID更改为mSavedNoteId,并将其设置为可为空的IntegerLong而不是intlong。 (不确定您使用的是哪个。)让null表示您不使用已保存的笔记。活动打开时,您可以根据附加值分配mSavedNoteId的值,如果没有附加值,则将其保留为null。仅在首次保存时创建ID号并将其分配给mSavedNoteId。最后,您的if语句可以检查mSavedNoteId是否为空,以确定是否应保存新笔记或更新现有笔记。

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


我想也许是您的视图模型实现在您调用insert()时生成了一个ID。在这种情况下,使insert()返回生成的ID并更改else分支,如下所示:

mSavedNoteId = mAddEditNoteViewModel.insert(note);
Toast.makeText(this, "Note Updated", Toast.LENGTH_SHORT).show();

10-07 13:16