OnStop() 多次将数据保存到数据库
Posted
技术标签:
【中文标题】OnStop() 多次将数据保存到数据库【英文标题】:OnStop() saves data to database multiple times 【发布时间】:2021-09-30 08:48:48 【问题描述】:android 官方文档建议在 onStop() 中保存数据。但问题是当我将数据保存在 onStop 时,数据在某些情况下会被多次保存。例如:“当我最小化活动时,返回活动,然后再次最小化活动”,这使得数据保存多次,因为每次活动最小化都会调用 onStop。我希望数据只保存一次,因为多次保存数据只会对数据库造成垃圾邮件。
这是 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();
updateNote 方法:
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();
【问题讨论】:
更改saveNote()
的代码,以便它在第一次调用时将行插入到表中,并为任何后续调用更新行。
你的 saveNote() 方法是如何工作的?保存数据时,您需要考虑新项目与要更新的项目。
@forpas 你能详细说明一下吗
@Eenvincible 我已将 saveNote() 代码添加到问题中
可靠的代码设计将引导您创建像insertOrUpdate()
这样的单个函数,然后在其中执行帮助您判断项目是否已存在于数据库中的机制;这将比使用两种几乎完全相同的方法更容易。
【参考方案1】:
一个简单的解决方案。
只需在您的 AddNoteActivity 中添加一个成员变量:
private var _added = false
然后在 onStop() 中,检查 _added:
if (!_added)
_added = true
saveNote()
_add 标志仅在创建活动时创建,因此即使在 onPause()、onStop() 和 onStart() onResume() 之后它也应该保持不变。
【讨论】:
顺便说一句,你应该实现 updateNote(),所以如果 _added 为真,你应该更新笔记。 非常感谢您的精彩回答【参考方案2】:当该活动不再对用户可见时调用onStop()
。 (例如:- 最小化您正确提到的应用程序)。我自己也遇到过类似的问题。
我为解决这个问题所做的工作是一种非常简单的合乎逻辑的方法。在插入数据之前,我检查了它是否是具有相同值的先前条目。 (使用我在 DatabaseHandler
类中创建的方法)。
但是,如果您要保存大量数据,这可能会有点麻烦。 (就我而言,我只保存了一些条目)。在这种情况下尝试onUserLeaveHint()
Read More on onUserleaveHint()
A Similar thread you might be interested in
【讨论】:
以上是关于OnStop() 多次将数据保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章