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 类中创建的方法)。

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

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

Read More on onUserleaveHint()

A Similar thread you might be interested in

【讨论】:

以上是关于OnStop() 多次将数据保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 文档多次上传未保存到数据库

使用 UserDefaults 保存数据的正确事件是啥?

应用程序在 onStop() 完成之前终止

什么是使用UserDefaults保存数据的适当事件?

保存数据返回后可以继续编辑

android笔记--保存和恢复activity的状态数据