zoukankan      html  css  js  c++  java
  • Android存储--SharedPreferences

    简介

    在Android中,主要有以下几种存储方式:

    1. SharedPreferences,在键值对中存储私有原始数据。
    2. 内部存储,在设备内存中存储私有数据。

    官方示例:

    String FILENAME = "hello_file";
    String string = "hello world!";
    
    FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
    fos.write(string.getBytes());
    fos.close();
    
    1. 外部存储,在共享的外部存储中存储公共数据。

    使用外部存储,需要获取外部存储的读写权限。
    外部存储主要包括存储公用文件(与其他应用共享)和不愿共享的私有文件以及缓存。

    官方示例:

    公有文件:以下方法在公共图书目录中创建了一个用于新相册的目录:

    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;
    }
    
    
    1. 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的使用

    1. 要读取SharePreferences存储的数据,首先要获得SharedPreferences的对象:
    • getSharedPreferences()-如果需要多个按名称识别的首选项文件,使用此方法
    • getPreferences()-如果只需要一个用于Activity的首选项文件,使用此方法。
    1. 存储数据时,

    2. 调用edit()以获得SharedPreferences.Editor

    3. 使用 putBoolean() 和 putString() 等方法添加值

    4. 使用 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。

    更多相关的方法:

    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();
    		}
    	}
    
    }
    
    
  • 相关阅读:
    声明式编程和命令式编程的比较
    函数式编程
    读《暗时间》
    动态语言和静态语言的比较
    2013第二次实训
    for惠普2013实习生
    bat的大数据
    android stduio优化
    当move手势太快,降低频率
    ANR没root的时候处理*(转)
  • 原文地址:https://www.cnblogs.com/charlottepl/p/12550051.html
Copyright © 2011-2022 走看看