刚刚创建后更新笔记

Updating a note after it was just created

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

保存笔记的代码:

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)。但是,当用户刚刚创建笔记并没有返回主节点时 activity,每次新创建的笔记更新而不返回主节点时,都会调用 else if 语句,从而创建一个新的笔记。我似乎找不到解决这个问题的方法。我想只在用户返回主 activity 后保存新笔记,但如果用户创建笔记,单击复选标记图标(保存)并关闭应用程序而不返回主, note 将不会被保存。我该如何解决这个问题?

如果我没理解错的话,你是在使用 EXTRA_ID 的存在来判断当前正在编辑的笔记是否已经存在。

但是 EXTRA_ID 的存在真正意味着 Activity 是用加载现有 ID 的指令打开的。

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

有很多方法可以解决这个问题。我要做的是将 mID 更改为 mSavedNoteId 并使其成为可为空的 IntegerLong 而不是 intlong。 (不确定您使用的是哪个。)让 null 值表示您没有使用已保存的笔记。当activity打开时,你可以根据extra给mSavedNoteId赋值,如果没有extra,就保留为null。只在第一次保存时创建ID号并赋值给mSavedNoteId。最后,您的 if 语句可以检查 mSavedNoteId 是否为 null 以确定是否应保存新笔记或更新现有笔记。

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() return 成为生成的 ID 并像这样更改 else 分支:

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

我通过执行以下操作获得了我想要的结果:

在我的存储库中,我 return 使用 get 方法很长,其中 returns id 在 asynctask 的 doInBackground 方法中被 returned 并且与之前不同(其中在传递插入结果后发生在后台执行(空))直到 doInBackground 运行才传递结果:

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

然后视图模型得到 return long

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

一切都按预期进行。非常感谢@Tenfour04 的帮助