SharedPreferences 存List集合,模擬數據庫,隨時存取


PS:SharedPreferences只要稍微學過一點就會用,他本身通過創建一個Editor對象,來存儲提交,而editor可以存的格式為

他里面可以存一個Set<String> 

 

Set<String> list=new HashSet<>();
            list.add("111"); 
            list.add("111");
            editor.putStringSet(keyStr,list);

 

HashSet是Java中非常常用的數據結構對象,HashSet是通過HashMap實現的,TreeSet是通過TreeMap實現的,只不過Set用的只是Map的key 。這里有hashset百度百科,不懂的可以看看https://baike.baidu.com/item/HashSet/8887897?fr=aladdin

 

Set也是一個集合,但是該集合不能存重復的值,不像list集合那樣常用,但是SP只能存放Set,不能直接存放List,但是我們可以把他轉換成字符串,讀取的時候把字符串再轉變成List就可以,我之前參加國賽的時候,就會用到很多數據,之前都是寫SQLite,但是SQLite不是很好管理,而且,存的東西非常少的時候,再寫SQLite就感覺到沒必要了,所以,就寫了這樣一個轉換類。

  • 寫入:字符串-->List集合

  • 讀取:List集合-->字符串  

方法一 

該方法不依賴外部jar包,就是沒有網絡也是可以做了,但方法二是需要添加一個依賴,就是GSON。

1:我寫的是List<Object[]> ,只要是該形式,Object的長度是多少都行。(當然不能超過限制)

package day1.cn.ceshi001;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by liuzhitong on 2017/6/6.
 *
 * @Author : liuzhitong
 * @Description :
 */

public class ListOrStrTools {
    public Context context;
    public String spStr,keyStr;
    private final SharedPreferences sp1;
    private Object[] obj;

    public ListOrStrTools(Context context, String spStr, String keyStr) {
        this.context = context;
        this.spStr = spStr;
        this.keyStr = keyStr;
        sp1 = context.getSharedPreferences(spStr,0);
    }

    public void setData(List<Object[]> lis){

        //存入之前要先把之前的數據拿出來
        String str="";
        String s=sp1.getString(keyStr,"404");
        if(s.equals("404")){
            Log.e("sp添加出錯","404");
        }
        else{str+=s;}
        if(lis.size()==0){
            Log.e("sp----lis","0");
        }
        //轉換List集合---->字符串
        else{
            for(int i=0;i<lis.size();i++){
                //檢測list<Object[]>中的object對象的長度
                for(int j=0;j<lis.get(i).length;j++){
                    str+=lis.get(i)[j]+"[&]";
                }

                str+="[^]";
            }
            SharedPreferences.Editor editor=sp1.edit();
            editor.putString(keyStr,str);

            editor.commit();
        }
    }

    public List<Object[]> getData(){
        List<Object[]> li1=new ArrayList<>();

        String s=sp1.getString(keyStr,"404");
        if(s.equals("404")){
            Log.e("讀取出錯","404");
            return li1;
        }
        //字符串---->List集合
        else{
            String data1[]=s.split("\\[\\^\\]");
            for(int i=0;i<data1.length;i++){
                String da1[]=data1[i].split("\\[\\&\\]");
                int num=da1.length;
                    obj = new Object[num];
                for(int j=0;j<num;j++){
                    obj[j]=da1[j];
                }
                li1.add(obj);
            }
            return li1;
        }


    }
}

2:調用該類

ListOrStrTools listOrStrTools = new ListOrStrTools(this, "info", "li1");//參數分別是:this(本類上下文),模擬數據庫名字,表名。想當於

sp1 = context.getSharedPreferences(spStr,0);

 List<Object[]> li = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            objects = new Object[4];
            objects[0] = i;
            objects[1] = "11";
            objects[2] = "22";
            objects[3] = "333";
            li.add(objects);
        }

        ListOrStrTools listOrStrTools = new ListOrStrTools(this, "info", "li1");
        listOrStrTools.setData(li);
        List<Object[]> list1 = listOrStrTools.getData();//取出數據,並返回一個list集合。
        Log.e("ssss", list1.get(0)[3] + "");
        for (int i = 0; i < list1.size(); i++) {//打印存入的集合
            for (int j = 0; j < list1.get(i).length; j++) {
                Log.e("sss", list1.get(i)[j] + "");
            }
        }

結果成功取出

方法二:

利用gson這個依賴把字符串或者list轉成json字符串格式存入sp中,然后操作的時候也是用sp拿出剛才存入的json字符串,修過之后再存入,麻煩歸麻煩,封裝成方法,麻煩一次終身受益。

添加依賴 app->build.gradle

implementation 'com.google.code.gson:gson:2.8.1'//compile(studio3.0之前)和implementation(3.0之后)

數據轉成JSON字符串

 UserBean userBean;
        List<UserBean> list = new ArrayList<>();
        for(int i=0;i<3;i++){
            userBean = new UserBean();
            userBean.setAge(10);
            userBean.setName("小王");
            list.add(userBean);
        }
        Gson gson=new Gson();
        String listStr = gson.toJson(list);

把結構listStr存入sp。

取出數據(List集合)

先看源碼,傳入一個JSON字符串,第二個參數要求是什么類型,可以是list集合,泛型等。

public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException {
    if (json == null) {
      return null;
    }
    StringReader reader = new StringReader(json);
    T target = (T) fromJson(reader, typeOfT);
    return target;
  }

取出

        List<UserBean> lis = gson.fromJson(listStr,new TypeToken<List<UserBean>>(){}.getType());

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM