采得百花成蜜后,为谁辛苦为谁甜。这篇文章主要讲述Android存储--SharedPreferences相关的知识,希望能为你提供帮助。
简介在android中,主要有以下几种存储方式:
- SharedPreferences,在键值对中存储私有原始数据。
- 内部存储,在设备内存中存储私有数据。
官方示例:
String FILENAME = "
hello_file"
;
String string = "
hello world!"
;
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
- 外部存储,在共享的外部存储中存储公共数据。
外部存储主要包括存储公用文件(与其他应用共享)和不愿共享的私有文件以及缓存。
官方示例:公有文件:以下方法在公共图书目录中创建了一个用于新相册的目录:
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user‘s public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "
Directory not created"
);
}
return file;
}
- sqlite数据库
创建新 SQLite 数据库的推荐方法是创建 SQLiteOpenHelper 的子类并覆盖 onCreate() 方法,在此方法中,您可以执行 SQLite 命令以创建数据库中的表。
官方示例:
public class DictionaryOpenHelper extends SQLiteOpenHelper {private static final int DATABASE_VERSION = 2;
private static final String DICTIONARY_TABLE_NAME = "
dictionary"
;
private static final String DICTIONARY_TABLE_CREATE =
"
CREATE TABLE "
+ DICTIONARY_TABLE_NAME + "
("
+
KEY_WORD + "
TEXT, "
+
KEY_DEFINITION + "
TEXT);
"
;
DictionaryOpenHelper(Context context) {
super(context, DATABASE_NAE, null, DATABASE_VERSION);
}@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
回到我们的重点,SharedPreferences。SharedPreferences是安卓数据存储的一个框架,它可以方便地存储和读取永久性键值对数据。SharedPreferences可以用来存储任何基本类型的数据,如String、Int等,注意它的存储是永久性的,也就是应用关闭后,它依然保留着。
SharedPreferences的使用
- 要读取SharePreferences存储的数据,首先要获得SharedPreferences的对象:
- getSharedPreferences()-如果需要多个按名称识别的首选项文件,使用此方法
- getPreferences()-如果只需要一个用于Activity的首选项文件,使用此方法。
- 存储数据时,
- 调用edit()以获得SharedPreferences.Editor
- 使用 putBoolean() 和 putString() 等方法添加值
- 使用 commit() 提交新值
示例代码:
package com.meituan.huangdanyang.practise;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import com.meituan.huangdanyang.practise.BaseActivity;
import java.util.List;
public class MainActivity extends BaseActivity {
private final static String MY_PRE_NAME = "
my preferences"
;
private final static String MY_PRE_STRING_KEY = "
KEY1"
;
private final static String MY_PRE_INT_KEY = "
KEY2"
;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences preferences = getSharedPreferences(MY_PRE_NAME, Context.MODE_PRIVATE);
System.out.println(MY_PRE_STRING_KEY + "
"
+ preferences.getString(MY_PRE_STRING_KEY,
"
NULL"
));
System.out.println(MY_PRE_INT_KEY + "
"
+ preferences.getInt(MY_PRE_INT_KEY, 0));
SharedPreferences.Editor editor = preferences.edit();
editor.putString(MY_PRE_STRING_KEY, this.toString());
editor.putInt(MY_PRE_INT_KEY, this.hashCode());
editor.apply();
}@Override
protected void onStop() {
super.onStop();
SharedPreferences preferences = getSharedPreferences(MY_PRE_NAME, Context.MODE_PRIVATE);
if (preferences.contains(MY_PRE_STRING_KEY)) {
System.out.println(MY_PRE_STRING_KEY + "
"
+ preferences.getString(MY_PRE_STRING_KEY,
"
NULL"
));
}
if (preferences.contains(MY_PRE_INT_KEY)) {
System.out.println(MY_PRE_INT_KEY + "
"
+ preferences.getInt(MY_PRE_INT_KEY, 0));
}
}@Override
protected String getName() {
return "
MainActivity"
;
}}
如上,存储activity的对象名字和hashcode。
【Android存储--SharedPreferences】更多相关的方法:
package ******import android.content.Context;
import android.content.SharedPreferences;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
public class SPUtils
{
public SPUtils()
{
/* cannot be instantiated */
throw new UnsupportedOperationException("
cannot be instantiated"
);
} /**
* 保存在手机里面的文件名
*/
public static final String FILE_NAME = "
share_data"
;
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param context
* @param key
* @param object
*/
public static void put(Context context, String key, Object object)
{SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if (object instanceof String)
{
editor.putString(key, (String) object);
} else if (object instanceof Integer)
{
editor.putInt(key, (Integer) object);
} else if (object instanceof Boolean)
{
editor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float)
{
editor.putFloat(key, (Float) object);
} else if (object instanceof Long)
{
editor.putLong(key, (Long) object);
} else
{
editor.putString(key, object.toString());
}SharedPreferencesCompat.apply(editor);
} /**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*
* @param context
* @param key
* @param defaultObject
* @return
*/
public static Object get(Context context, String key, Object defaultObject)
{
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
if (defaultObject instanceof String)
{
return sp.getString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer)
{
return sp.getInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean)
{
return sp.getBoolean(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float)
{
return sp.getFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long)
{
return sp.getLong(key, (Long) defaultObject);
}return null;
} /**
* 移除某个key值已经对应的值
*
* @param context
* @param key
*/
public static void remove(Context context, String key)
{
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
SharedPreferencesCompat.apply(editor);
} /**
* 清除所有数据
*
* @param context
*/
public static void clear(Context context)
{
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
SharedPreferencesCompat.apply(editor);
} /**
* 查询某个key是否已经存在
*
* @param context
* @param key
* @return
*/
public static boolean contains(Context context, String key)
{
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
return sp.contains(key);
} /**
* 返回所有的键值对
*
* @param context
* @return
*/
public static Map<
String, ?>
getAll(Context context)
{
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
return sp.getAll();
} /**
* 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
*
* @author zhy
*
*/
private static class SharedPreferencesCompat
{
private static final Method sApplyMethod = findApplyMethod();
/**
* 反射查找apply的方法
*
* @return
*/
@SuppressWarnings({ "
unchecked"
, "
rawtypes"
})
private static Method findApplyMethod()
{
try
{
Class clz = SharedPreferences.Editor.class;
return clz.getMethod("
apply"
);
} catch (NoSuchMethodException e)
{
}return null;
}/**
* 如果找到则使用apply执行,否则使用commit
*
* @param editor
*/
public static void apply(SharedPreferences.Editor editor)
{
try
{
if (sApplyMethod != null)
{
sApplyMethod.invoke(editor);
return;
}
} catch (IllegalArgumentException e)
{
} catch (IllegalAccessException e)
{
} catch (InvocationTargetException e)
{
}
editor.commit();
}
}}
推荐阅读
- 微信小程序uniapphas not been registered yet.报错解决方案
- APP开发过程
- P12 添加 AutoMapper
- vant Weapp使用 引入
- Android.mk文件Application.mk文件编写规则
- 性能比肩美拍秒拍的Android视频录制编辑特效解决方案
- Android OnClick的四种方法
- Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/mapp
- 网页打开Android APP