1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/**
* @author xzj
* @date 2016/8/24 15:40.
*/

import android.content.Context;
import android.content.SharedPreferences;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.List;

/**
* SharedPreferences工具类, 可以通过传入实体对象保存其至SharedPreferences中,
* 并通过实体的类型Class将保存的对象取出. 支持不带泛型的对象以及List集合
*/
public class SPUtils {

private static final String LIST_TAG = ".LIST";
private static SharedPreferences sharedPreferences;
private static Gson gson;

/**
* 使用之前初始化, 可在Application中调用
* @param context 请传入ApplicationContext避免内存泄漏
*/
public static void init(Context context) {
sharedPreferences = context.getSharedPreferences("shared_files",
Context.MODE_PRIVATE);
gson = new Gson();
}

private static void checkInit() {
if (sharedPreferences == null || gson == null) {
throw new IllegalStateException("Please call init(context) first.");
}
}

/**
* 保存对象数据至SharedPreferences, key默认为类名, 如
* <pre>
* PreferencesHelper.putData(saveUser);
* </pre>
* @param data 不带泛型的任意数据类型实例
*/
public static <T> void putData(T data) {
putData(data.getClass().getName(), data);
}

/**
* 根据key保存对象数据至SharedPreferences, 如
* <pre>
* PreferencesHelper.putData(key, saveUser);
* </pre>
* @param data 不带泛型的任意数据类型实例
*/
public static <T> void putData(String key, T data) {
checkInit();
if (data == null)
throw new IllegalStateException("data should not be null.");
sharedPreferences.edit().putString(key, gson.toJson(data)).apply();
}

/**
* 保存List集合数据至SharedPreferences, 请确保List至少含有一个元素, 如
* <pre>
* PreferencesHelper.putData(users);
* </pre>
* @param data List类型实例
*/
public static <T> void putData(List<T> data) {
checkInit();
if (data == null || data.size() <= 0)
throw new IllegalStateException(
"List should not be null or at least contains one element.");
Class returnType = data.get(0).getClass();
sharedPreferences.edit().putString(returnType.getName() + LIST_TAG,
gson.toJson(data)).apply();
}

/**
* 将数据从SharedPreferences中取出, key默认为类名, 如
* <pre>
* User user = PreferencesHelper.getData(key, User.class)
* </pre>
*/
public static <T> T getData(Class<T> clz) {
return getData(clz.getName(), clz);
}

/**
* 根据key将数据从SharedPreferences中取出, 如
* <pre>
* User user = PreferencesHelper.getData(User.class)
* </pre>
*/
public static <T> T getData(String key, Class<T> clz) {
checkInit();
String json = sharedPreferences.getString(key, "");
return gson.fromJson(json, clz);
}

/**
* 将数据从SharedPreferences中取出, 如
* <pre>List<User> users = PreferencesHelper.getData(List.class, User.class)</pre>
*/
public static <T> List<T> getData(Class<List> clz, Class<T> gClz) {
checkInit();
String json = sharedPreferences.getString(gClz.getName() + LIST_TAG, "");
return gson.fromJson(json, new TypeToken<List>(){}.getType());
}

/**
* 简易字符串保存, 仅支持字符串
*/
public static void putString(String key, String data) {
sharedPreferences.edit().putString(key, data).apply();
}

/**
* 简易字符串获取, 仅支持字符串
*/
public static String getString(String key) {
return sharedPreferences.getString(key, "");
}

public static void putInt(String key, int data) {
sharedPreferences.edit().putInt(key,data).apply();
}

public static int getInt(String key) {
return sharedPreferences.getInt(key, -1);
}

public static void putBoolean(String key, boolean data) {
sharedPreferences.edit().putBoolean(key,data).apply();
}

public static boolean getBoolean(String key,boolean defaultData) {
return sharedPreferences.getBoolean(key, defaultData);
}

public static void putFloat(String key, float data) {
sharedPreferences.edit().putFloat(key,data).apply();
}

public static float getFloat(String key,float defaultData) {
return sharedPreferences.getFloat(key, defaultData);
}

public static void putLong(String key, long data) {
sharedPreferences.edit().putLong(key,data).apply();
}

public static float getLong(String key,long defaultData) {
return sharedPreferences.getLong(key, defaultData);
}

public static void clear() {
sharedPreferences.edit().clear().apply();
}

/**
* 删除保存的对象
*/
public static void remove(String key) {
sharedPreferences.edit().remove(key).apply();
}

/**
* 删除保存的对象
*/
public static void remove(Class clz) {
remove(clz.getName());
}

/**
* 删除保存的数组
*/
public static void removeList(Class clz) {
sharedPreferences.edit().remove(clz.getName() + LIST_TAG).apply();
}
}