如何使用 SharedPreferences 系统地存储和获取数据?

Posted

技术标签:

【中文标题】如何使用 SharedPreferences 系统地存储和获取数据?【英文标题】:How to store and fetch data systematically with using SharedPreferences? 【发布时间】:2021-06-29 17:18:25 【问题描述】:

我有一个用于列出电影的应用程序。用户应该能够在提要中列出他们最喜欢的电影。我正在使用 SharedPreferences 来做到这一点。对于列表,我使用 ListView。但是,当我在列表中添加新电影时,它会替换为以前的电影。

这是 ListActivity ,

public class ListActivity extends AppCompatActivity 

    ListView listView;
    ImageView listTitleImage;
    ImageView homeIcon;
    ImageView userListIcon;
    ImageView searchIcon;
    ImageView accountIcon;

    public static SharedPreferences sharedPreferences;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        listView = findViewById(R.id.listView);
        listTitleImage = findViewById(R.id.listTitleImage);
        homeIcon = findViewById(R.id.homeListImageViewList);
        userListIcon = findViewById(R.id.homeListImageViewList);
        searchIcon = findViewById(R.id.searchImageViewList);
        accountIcon = findViewById(R.id.accountImageViewList);

        sharedPreferences = getApplicationContext().getSharedPreferences("Save", Context.MODE_PRIVATE);

        String title = sharedPreferences.getString(String.valueOf(1),"No movie");
        String poster = sharedPreferences.getString(String.valueOf(2),"No poster");

        ArrayList<List> list = new ArrayList<>();

        list.add(new List(title,poster));

        ListAdapter listAdapter = new ListAdapter(this,R.layout.movie_list,list);

        listView.setAdapter(listAdapter);

    

这是我存储电影详细信息的地方。 'resultList' 是我用来从 api 获取数据的数组列表。

@Override
    public boolean onMenuItemClick(MenuItem item) 


        if(item.getItemId() == R.id.menuAdd)

            String title = resultList.get(pos).getTitle();
            String posterpath = resultList.get(pos).getPoster_path();

            sharedPreferences = context.getSharedPreferences("Save", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString(String.valueOf(1),title);
            editor.putString(String.valueOf(2),posterpath);
            editor.apply();

            Intent intent1 = new Intent(context,ListActivity.class);
            context.startActivity(intent1);

            return true;

        
        else if(item.getItemId() == R.id.menuShowDetails)

            int movieId = resultList.get(pos).getMovieId();
            Intent intent1 = new Intent(context, MovieDetails.class);
            intent1.putExtra("movie_id",movieId);
            context.startActivity(intent1);
            return true;

        
        return false;
    

【问题讨论】:

问题在于,当您“添加”这些值(editor.putString(String.valueOf(1),title);editor.putString(String.valueOf(2),posterpath);)时,您所做的是覆盖以前的值。您可能正在寻找 putStringSet 甚至使用 SQLITE 数据库来代替 至少使用本地数据库,这样使用列表更容易,也可以使用recyclerview 【参考方案1】:

最好的解决方案是,你必须使用 SQLite 数据库或房间数据库来存储列表,因为它很容易使用,并且每次要更新时都可以更新......

对于 Sqlite 参考 - https://www.javatpoint.com/android-sqlite-tutorial

房间数据库参考 - https://medium.com/mindorks/using-room-database-android-jetpack-675a89a0e942

【讨论】:

以上是关于如何使用 SharedPreferences 系统地存储和获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter + SharedPreferences:如何使用 FutureBuilder

如何正确的使用SharedPreferences

如何在 Flutter 中使用 SharedPreferences 和 Injectable?

如何使用 Sharedpreferences 存储 EditText 样式(粗体、斜体、颜色等)

android进程间共享简单数据

如何在颤振中使用 SharedPreferences?