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() 之后它也应该持续存在。
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() 之后它也应该持续存在。