1. 程式人生 > >Android實現List儲存到SharedPreferences工具類

Android實現List儲存到SharedPreferences工具類

輕量級的資料,需要儲存到SharedPreferences中,但只能儲存一些整形、Long、布林型、字串,類似List<String>儲存沒有實現,當然你可以選擇儲存到本地sqlite資料庫,考慮到自己的需求來看,如果本身資料較少,比如說使用者建立的資料夾名稱,用於分類一些圖片,使用者不可能建立成千上萬個名稱儲存的,所以沒必要增加資料庫,增加了反而提升了複雜度。

另外android也是可以儲存陣列到SharedPreferences的,在3.0以上的api已經實現,SharedPreferences提供了putStringSet方法,可以儲存字串陣列。看到Set,那我們知道這個是無順序的,就算你使用LinkedHashSet也無濟於事,因為有人看了原始碼實現,發現底層都是轉化為HashSet實現的,所以取出無序自然無法得到保障,除非自己去重寫。

為什麼需要有序的List<String>,想想一種場景結合ListView、GridView使用,這種有序可以保證使用者的先後建立順序,取出的時候也是有序的,通過展示自然也是有序的。

好了,下面是我的一個工具類,當然可以擴充套件為一個完整的SharedPreferencesUtil,我這裡只是實現了將List<String>儲存到SharedPreferences,並可以移除的部分。註釋都在程式碼中了。

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

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

/**
 * SharedPrefs儲存List<String>工具類
 */
public class SharedPrefsStrListUtil {

	/** 資料儲存的XML名稱 **/
	public final static String SETTING = "SharedPrefsStrList";

	/**
	 * 儲存資料(Int)
	 * 
	 * @param context
	 * @param key
	 * @param value
	 */
	private static void putIntValue(Context context, String key, int value) {
		Editor sp = context.getSharedPreferences(SETTING, Context.MODE_PRIVATE)
				.edit();
		sp.putInt(key, value);
		sp.commit();
	}

	/**
	 * 儲存資料(String)
	 * 
	 * @param context
	 * @param key
	 * @param value
	 */
	private static void putStringValue(Context context, String key, String value) {
		Editor sp = context.getSharedPreferences(SETTING, Context.MODE_PRIVATE)
				.edit();
		sp.putString(key, value);
		sp.commit();
	}

	/**
	 * 儲存List<String>
	 * 
	 * @param context
	 * @param key
	 *            List<String>對應的key
	 * @param strList
	 *            對應需要儲存的List<String>
	 */
	public static void putStrListValue(Context context, String key,
			List<String> strList) {
		if (null == strList) {
			return;
		}
		// 儲存之前先清理已經存在的資料,保證資料的唯一性
		removeStrList(context, key);
		int size = strList.size();
		putIntValue(context, key + "size", size);
		for (int i = 0; i < size; i++) {
			putStringValue(context, key + i, strList.get(i));
		}
	}

	/**
	 * 取出資料(int)
	 * 
	 * @param context
	 * @param key
	 * @param defValue
	 *            預設值
	 * @return
	 */
	private static int getIntValue(Context context, String key, int defValue) {
		SharedPreferences sp = context.getSharedPreferences(SETTING,
				Context.MODE_PRIVATE);
		int value = sp.getInt(key, defValue);
		return value;
	}

	/**
	 * 取出資料(String)
	 * 
	 * @param context
	 * @param key
	 * @param defValue
	 *            預設值
	 * @return
	 */
	private static String getStringValue(Context context, String key,
			String defValue) {
		SharedPreferences sp = context.getSharedPreferences(SETTING,
				Context.MODE_PRIVATE);
		String value = sp.getString(key, defValue);
		return value;
	}

	/**
	 * 取出List<String>
	 * 
	 * @param context
	 * @param key
	 *            List<String> 對應的key
	 * @return List<String>
	 */
	public static List<String> getStrListValue(Context context, String key) {
		List<String> strList = new ArrayList<String>();
		int size = getIntValue(context, key + "size", 0);
		//Log.d("sp", "" + size);
		for (int i = 0; i < size; i++) {
			strList.add(getStringValue(context, key + i, null));
		}
		return strList;
	}

	/**
	 * 清空List<String>所有資料
	 * 
	 * @param context
	 * @param key
	 *            List<String>對應的key
	 */
	public static void removeStrList(Context context, String key) {
		int size = getIntValue(context, key + "size", 0);
		if (0 == size) {
			return;
		}
		remove(context, key + "size");
		for (int i = 0; i < size; i++) {
			remove(context, key + i);
		}
	}

	/**
	 * @Description TODO 清空List<String>單條資料
	 * @param context
	 * @param key
	 *            List<String>對應的key
	 * @param str
	 *            List<String>中的元素String
	 */
	public static void removeStrListItem(Context context, String key, String str) {
		int size = getIntValue(context, key + "size", 0);
		if (0 == size) {
			return;
		}
		List<String> strList = getStrListValue(context, key);
		// 待刪除的List<String>資料暫存
		List<String> removeList = new ArrayList<String>();
		for (int i = 0; i < size; i++) {
			if (str.equals(strList.get(i))) {
				if (i >= 0 && i < size) {
					removeList.add(strList.get(i));
					remove(context, key + i);
					putIntValue(context, key + "size", size - 1);
				}
			}
		}
		strList.removeAll(removeList);
		// 刪除元素重新建立索引寫入資料
		putStrListValue(context, key, strList);
	}

	/**
	 * 清空對應key資料
	 * 
	 * @param context
	 * @param key
	 */
	public static void remove(Context context, String key) {
		Editor sp = context.getSharedPreferences(SETTING, Context.MODE_PRIVATE)
				.edit();
		sp.remove(key);
		sp.commit();
	}

	/**
	 * 清空所有資料
	 * 
	 * @param context
	 */
	public static void clear(Context context) {
		Editor sp = context.getSharedPreferences(SETTING, Context.MODE_PRIVATE)
				.edit();
		sp.clear();
		sp.commit();
	}

}

相關推薦

Android實現List儲存SharedPreferences工具

輕量級的資料,需要儲存到SharedPreferences中,但只能儲存一些整形、Long、布林型、字串,類似List<String>儲存沒有實現,當然你可以選擇儲存到本地sqlite資料庫,考慮到自己的需求來看,如果本身資料較少,比如說使用者建立的資料夾名稱,

java&androidlist集合排序工具

user實體   public class User { private int id; private String name; private String age; public User(int id, String name, String age) {

Android SharedPreferences工具實現List/Map的儲存讀取

最近因為需要將List集合和Map集合的資料儲存到SharedPreferences中,所以對以前自己封裝的SharedPreferencesUtil進行了修改,在原有的儲存讀Integer,String,Float,Long,Boolean,Object的基礎上增加了儲存讀取List<Obj

list集合實現模糊查詢的工具

public class FuzzyQueryUtils {     public static List fuzzyQuery (String name,List list){         List fu

Android studio 封裝請求網路工具以及實現(包含單例模式)

一般我們在請求網路資料時都會通過一個或多個連結去請求網路資料,但對於一些初學人士都只是在一個類裡或MainActivity做很多操作,這樣的話耦合度太高,程式碼感覺非常繁瑣,專案執行時可能會卡。一般在公司裡面也會要求低耦合,高類聚。這時就會通過封裝工具類來降低耦合度,這樣也就減少了程式碼與程

AndroidSharedPreferences工具

本工具類永久維護,永久更新,如果各位讀者發現有bug或者不合理之處,請留言,博主將第一時間改正。 本工具類提供的功能有: 1.儲存五種型別的資料; 2.讀取五種型別的資料; 內容如下: import android.content.Context; import an

Android 獲取建立各種儲存路徑工具(內建許可權獲取)

前言 最近工作比較輕,從專案中總結抽象出一些工具類,利人利己,歡迎交流完善~ 概念介紹 1、內部儲存 Internal Storage: 注意內部儲存不是記憶體。內部儲存位於系統中很特殊的一個位置,如果你想將檔案儲存於內部儲存中,那麼檔案預設

android 獲取手機信息工具

telephony == 系統 設備 android pack devices 信息 context package com.yqy.yqy_listviewheadview; import android.content.Context; import androi

android經常使用正則工具

col 中文字符 post 身份證號碼 obi content 支持 return 空白 此類提供日常開發中經常使用的正則驗證函數。比方:郵箱、手機號、電話號碼、身份證號碼、日期、數字、小數、URL、IP地址等。使用Pattern對象的matches方法進行整個字符匹配

List操作的工具

row exceptio val 字符串 rem 字符 sem != err 1 /** 2 * <p>list操作的工具類</p> 3 */ 4 public class ListUtil { 5 /** 6

list轉map工具,根據指定的字段分組

ase efi per getclass 字段 first err war ray import org.apache.log4j.Logger;import java.lang.reflect.Method;import java.util.ArrayList;impor

Android LogUtils打印日誌工具

Android 日誌打印 Log LogUtils打印日誌工具類 這是一個從XUtils3中摘抄出來的打印日誌工具類。這個類打印日誌比較詳細,可以打印類名、方法名。isDebug為打印日誌開關,初始化的時候可以使用LogUtils.isDebug(boolean b)來控制開關狀態。 public

儲存物件工具

public class ObjectSaveUtils { /** * @param context * @param name * @param obj all objs must implements {@code Serializable} */ pu

簡單實現jdbc連線資料庫工具

第一步:匯入連線mysql資料庫所需要的jar包 第二步:實現一個簡單的jdbc連線資料庫工具類 package jdbc; import java.sql.Connection; import java.sql.DriverManager; import ja

安卓專案實戰之好用的SharedPreferences工具封裝

SpUtils.java程式碼如下: public class SpUtils { /** * 儲存在手機裡面的檔名,在這裡要特別注意,因為在Android中已經確定了SharedPreferences是以xml形式儲存, * 所以,在填寫檔名引數時,不要

SpringBoot實現郵件傳送及其工具封裝

SpringBoot郵件傳送工具類 環境:JDK8、IDEA 依賴:SpringBoot-1.5.10、spring-boot-starter-mail、spring-boot-starter-thymeleaf、spring-boot-start

SharedPreferences工具的封裝

package com.moie.newsapp.utils; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPre

Android中Handler弱引用工具

經常會用到Handler,我們也清楚它會記憶體洩露,如果再View中使用,很難做到onDestroy( )中removeAllCallback(null),索性寫個工具類,但是我在專案中使用時候,發現有

基於Eros的Android端功能增強的工具

當前工具類支援--基礎依賴包wxframework <= 1.0.9 的版本 如果您的基礎依賴包wxframework的版本 > 1.0.9 , 為了使該工具類繼續可以使用, 可前往: Eros-plugin-android-extend 基於Eros框架下的

安卓 SharedPreferences 工具(支援物件存取)

一、快取輔助類 import android.content.Context; import android.content.SharedPreferences; import java.lang.reflect.InvocationTargetExcepti