OnStop() 多次保存数据到数据库

OnStop() saves data to database multiple times

android官方文档推荐在onStop()中保存数据。但问题是当我将数据保存在 onStop 中时,数据在某些情况下会被多次保存。例如:“当我将 activity、return 最小化为 activity,然后再次最小化 activity 时”,这会在调用 onStop 时多次保存数据任何时候 activity 被最小化。我希望数据只保存一次,因为多次保存数据只会对数据库造成垃圾邮件。

这是 onStop() 方法

@Override
protected void onStop() {
    // call the superclass method first
    super.onStop();

    // save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    saveNote();
    MainActivity.showNoteOnRecyclerView(AddNoteActivity.this);
}

保存笔记方法:

public void saveNote() {
    try {
        //puts notes,title data from the UI elements to the model class
        if (title.getText().length() > 0 || note.getText().length() > 0) {
            NoteModel noteModel = new NoteModel(title.getText().toString(), note.getText().toString());

            //saves the noteModel data to the database
            DatabaseHandler databaseHandler = new DatabaseHandler(AddNoteActivity.this);
            databaseHandler.insertData(noteModel);
            Toast.makeText(this, "Note Saved", Toast.LENGTH_SHORT).show();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}

更新说明方法:

public void updateNote() {
        try {
            //puts notes,title data from the UI elements to the model class and updates it in the database
            if (title.getText().length() > 0 || note.getText().length() > 0) {
                NoteModel noteModel = new NoteModel(title.getText().toString(), note.getText().toString());
                noteModel.setId(selectedId);
//               puts the updated data to the database
                DatabaseHandler databaseHandler = new DatabaseHandler(EditNoteActivity.this);
                databaseHandler.updateData(noteModel);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

当 activity 不再对用户可见时,将调用 onStop()。 (例如:- 正如您正确提到的那样最小化应用程序)。我自己也遇到过类似的问题。

我为解决这个问题所做的是一种非常简单的合乎逻辑的方法。在插入数据之前,我检查它是否是具有相同值的先前条目。 (使用我在 DatabaseHandler Class 中创建的方法)。

  • 如果有以前的条目并且值不同更新它。
  • else 如果条目不存在 插入 它。
  • 否则什么都不做。

但如果您要保存大量数据,这可能会有点麻烦。 (在我的例子中,我只保存了一些条目)。在那种情况下尝试 onUserLeaveHint()

Read More on onUserleaveHint()

一个简单的解决方案。

只需在您的 AddNoteActivity 中添加一个成员变量:

private var _added = false

然后在 onStop() 中,检查 _added:

if (!_added) {
   _added = true
   saveNote()
}

_added 标志仅在创建 activity 时创建,因此即使在 onPause()、onStop() 和 onStart() onResume() 之后它也应该持续存在。