如何使用 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
如何在 Flutter 中使用 SharedPreferences 和 Injectable?