Android开发:如何通过SharedPreferences存储ArrayList<Uri>
解决TinyDB存储ArrayList的问题
核心思路是将Uri对象转换为字符串存储,读取时再转回Uri对象——既然TinyDB支持String类型的ArrayList,就用这个特性间接实现Uri列表的持久化,具体步骤和代码修改如下:
实现步骤
- 存储阶段:遍历
ArrayList<Uri>,把每个Uri通过toString()转为字符串,存入新的ArrayList<String>后用TinyDB保存。 - 读取阶段:从TinyDB取出String列表,遍历每个字符串,通过
Uri.parse()还原为Uri对象,存入ArrayList<Uri>。
修改后的HomePage代码
package com.wainan.moh; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import android.widget.ListView; import android.widget.ImageButton; import android.view.View; import android.content.Intent; import java.util.ArrayList; import android.net.Uri; import com.wainan.moh.TinyDB; public class HomePage extends Activity { TextView tv, tv2; ListView lv; ImageButton bt; ArrayList<Uri> imgs = new ArrayList<>(); ArrayList<String> titles = new ArrayList<>(); ArrayList<String> years = new ArrayList<>(); ArrayList<String> descs = new ArrayList<>(); int itemAdded = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.page_home); getActionBar().hide(); tv = findViewById(R.id.tvLvNull); tv2 = findViewById(R.id.tvSubHint); lv = findViewById(R.id.mainListView); bt = findViewById(R.id.btShowAddPage); TinyDB db = new TinyDB(this); // 页面启动先读取已存数据 loadSavedData(db); itemAdded = getIntent().getIntExtra("itemChecked", 0); if (itemAdded == 1) { imgs.add(getIntent().getData()); titles.add(getIntent().getStringExtra("Title")); years.add(getIntent().getStringExtra("Year")); descs.add(getIntent().getStringExtra("Desc")); // 新增数据后立即保存 saveData(db); } updateEmptyState(); MainListAdapter ad = new MainListAdapter(this, imgs, titles, years, descs); lv.setAdapter(ad); bt.setOnClickListener(view -> startActivity(new Intent(HomePage.this, AddActivity.class))); } // 读取存储的数据 private void loadSavedData(TinyDB db) { // 读取文本类数据 titles = db.getListString("Titles"); years = db.getListString("Years"); descs = db.getListString("Descs"); // 读取Uri对应的字符串列表,转换为Uri对象 ArrayList<String> imgStrings = db.getListString("Imgs"); for (String imgStr : imgStrings) { imgs.add(Uri.parse(imgStr)); } } // 保存数据到TinyDB private void saveData(TinyDB db) { // 保存文本类数据 db.putListString("Titles", titles); db.putListString("Years", years); db.putListString("Descs", descs); // 将Uri列表转为字符串列表后保存 ArrayList<String> imgStrings = new ArrayList<>(); for (Uri uri : imgs) { imgStrings.add(uri.toString()); } db.putListString("Imgs", imgStrings); } // 更新空状态提示文本 private void updateEmptyState() { if (titles.isEmpty()) { tv.setText("Nothing To Show"); tv2.setText("Hit Add Button To Add"); } else { tv.setText(""); tv2.setText(""); } } }
关键说明
- 新增
loadSavedData和saveData方法,把数据读写逻辑抽离,代码结构更清晰。 - 页面启动时先读取历史数据,新增内容后立即保存,确保数据不会丢失。
- Uri与String的转换是安全的:
Uri.toString()会完整保留Uri的结构信息,Uri.parse()能准确还原出原Uri对象。
内容的提问来源于stack exchange,提问作者Abdulelah Al-Wainany
相关产品推荐
相关产品推荐

