• 数据存储与访问之——SharedPreferences


      使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而J2SE中使用properties属性文件与xml文件来保存软件的配置信息;而在Android中我们通常使用 一个轻量级的存储类——SharedPreferences来保存用户偏好的参数!SharedPreferences也是使用xml文件, 然后类似于Map集合,使用键-值的形式来存储数据;我们只需要调用SharedPreferencesgetXxx(name), 就可以根据键获得对应的值!使用起来很方便!

      SharedPreferences是一种轻型的Android数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。比较经典的使用方式例如用户输入框对过往登录账户的存储。实现SharedPreferences存储的步骤如下:

    1、根据Context获取SharedPreferences对象
    2、利用edit()方法获取Editor对象。
    3、通过Editor对象存储key-value键值对数据。
    4、通过apply()方法提交数据。
    

    版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
    作者By-----溺心与沉浮----博客园

    SharedPreferences的使用

      SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。使用Preference来存取数据,用到了SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中;

     1 1)写入数据:
     2      //步骤1:创建一个SharedPreferences对象
     3      SharedPreferences sharedPreferences= getSharedPreferences("data",Context.MODE_PRIVATE);
     4      //步骤2: 实例化SharedPreferences.Editor对象
     5      SharedPreferences.Editor editor = sharedPreferences.edit();
     6      //步骤3:将获取过来的值放入文件
     7      editor.putString("name", “Tom”);
     8      editor.putInt("age", 28);
     9      editor.putBoolean("marrid",false);
    10      //步骤4:提交               
    11      editor.commit();(apply())
    12 
    13  2)读取数据:
    14      SharedPreferences sharedPreferences= getSharedPreferences("data", Context .MODE_PRIVATE);
    15      String userId=sharedPreferences.getString("name","");
    16   
    17 3)删除指定数据
    18      editor.remove("name");
    19      editor.commit();
    20 
    21 4)清空数据
    22      editor.clear();
    23      editor.commit();(apply())

    版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
    作者By-----溺心与沉浮----博客园 

    注意:如果在 Fragment 中使用SharedPreferences 时,需要放在onAttach(Activity activity)里面进行SharedPreferences的初始化,否则会报空指针 即 getActivity()会可能返回null

    读写其他应用的SharedPreferences 步骤如下(未实践):
     1. 在创建SharedPreferences时,指定MODE_WORLD_READABLE模式,表明该SharedPreferences数据可以被其他程序读取;
     2. 创建其他应用程序对应的Context
     3. 使用其他程序的Context获取对应的SharedPreferences
     4. 如果是写入数据,使用Editor接口即可,所有其他操作均和前面一致;

     1 * SharedPreferences数据的四种操作模式:
     2      * 一、Context.MODE_PRIVATE
     3      * 二、Context.MODE_APPEND
     4      * 三、Context.MODE_WORLD_READABLE
     5      * 四、Context.MODE_WORLD_WRITEABLE
     6      *
     7      * Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
     8      * Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
     9      * Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
    10      *
    11      * MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
    12      * MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
    13      *
    14      * 特别注意:出于安全性的考虑,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已经被弃用
     1 try {
     2 //这里的com.example.mpreferences 就是应用的包名
     3  Context mcontext = createPackageContext("com.example.mpreferences", CONTEXT_IGNORE_SECURITY);
     4 
     5  SharedPreferences msharedpreferences = mcontext.getSharedPreferences("name_preference", MODE_PRIVATE);
     6  int count = msharedpreferences.getInt("count", 0);
     7 
     8  } catch (PackageManager.NameNotFoundException e) {
     9        e.printStackTrace();
    10  }

      新建一个安卓项目,在reslayoutactivity_main.xml添加代码

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            tools:context=".MainActivity">
    
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="用户登录"/>
        <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:text="请输入用户名"/>
        <EditText
                android:id="@+id/editUserName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="用户名"/>
        <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:text="请输入密码"/>
        <EditText
                android:id="@+id/editUserPassword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="密码"/>
        <Button
                android:id="@+id/button_login"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="登陆"/>
    </LinearLayout>

    效果如下:

     简单的SharedPreferences工具类编写SharedPreferences.java

     1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
     2 
     3 import android.content.Context;
     4 import android.content.SharedPreferences;
     5 import android.widget.Toast;
     6 
     7 import java.util.HashMap;
     8 import java.util.Map;
     9 
    10 public class SharedHelp {
    11     private Context context;
    12 
    13     public SharedHelp(){
    14 
    15     }
    16 
    17     public SharedHelp(Context context){
    18         this.context = context;
    19     }
    20 
    21     public void save(String userName, String passWord){
    22         SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
    23         SharedPreferences.Editor editor = sp.edit();
    24         editor.putString("userName", userName);
    25         editor.putString("passWord", passWord);
    26         editor.apply();
    27         Toast.makeText(context, "信息已写入SharedPreferences中", Toast.LENGTH_SHORT).show();
    28     }
    29 
    30     public Map<String, String> read(){
    31         Map<String, String> data = new HashMap<String, String>();
    32         SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
    33         data.put("userName", sp.getString("userName", ""));
    34         data.put("passWord", sp.getString("passWord", ""));
    35         return data;
    36     }
    37 }

     在MainActivity中实现逻辑

     1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
     2 
     3 import androidx.appcompat.app.AppCompatActivity;
     4 
     5 import android.content.Context;
     6 import android.os.Bundle;
     7 import android.view.View;
     8 import android.widget.Button;
     9 import android.widget.EditText;
    10 
    11 import java.util.Map;
    12 
    13 public class MainActivity extends AppCompatActivity {
    14     //实例化layout中EditText的editUserNmae
    15     private EditText editUserName;
    16     //实例化layout中EditText的editUserPassword
    17     private EditText editUserPassword;
    18     //实例化layout中Button的button_login
    19     private Button button_login;
    20     //定义上下文
    21     private Context context;
    22     //定义ShareHelp类的对象
    23     private SharedHelp sharedHelp;
    24     //定义两个字符串名
    25     private String strName;
    26     private String strPassword;
    27 
    28     @Override
    29     protected void onCreate(Bundle savedInstanceState) {
    30         super.onCreate(savedInstanceState);
    31         setContentView(R.layout.activity_main);
    32         //获取上下文
    33         context = getApplicationContext();
    34         sharedHelp = new SharedHelp();
    35         bindViews();
    36     }
    37 
    38     private void bindViews(){
    39         //实例化的变量绑定相应的ID
    40         editUserName = findViewById(R.id.editUserName);
    41         editUserPassword = findViewById(R.id.editUserPassword);
    42         button_login = findViewById(R.id.button_login);
    43         //为按钮设置监听事件
    44         button_login.setOnClickListener(new View.OnClickListener() {
    45             @Override
    46             public void onClick(View view) {
    47                 //当按钮被按下触发时,从控件中getText()并将其转换成字符串
    48                 strName = editUserName.getText().toString();
    49                 strPassword = editUserPassword.getText().toString();
    50                 //通过SharedHelp类中save方法,将其保存
    51                 sharedHelp.save(strName, strPassword);
    52             }
    53         });
    54     }
    55 
    56     @Override
    57     protected void onStart() {
    58         super.onStart();
    59         //定义一个Map<String, String>类型的变量data用来接收shareHelp.read()方法的返回值
    60         Map<String, String> data = sharedHelp.read();
    61         //将获取到的数据放置到两个EditText中
    62         editUserName.setText(data.get("userName"));
    63         editUserPassword.setText(data.get("passWord"));
    64     }
    65 }

     本人十分不建议代码在主程序入口处写,建议另起文件写,方便交流,就在MainActivity中写了

     版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
    作者By-----溺心与沉浮----博客园

     最后再写一个SharedPreferences的工具集类

     SharedPreferencesUtillty.java

      1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
      2 
      3 import android.content.Context;
      4 import android.content.SharedPreferences;
      5 
      6 import java.util.Map;
      7 
      8 public class SharedPreferenceUtillty {
      9     //保存的SP文件名
     10     public static final String FILE_NAME = "MyMap";
     11 
     12     /**
     13      * SharedPreferences数据的四种操作模式:
     14      * 一、Context.MODE_PRIVATE
     15      * 二、Context.MODE_APPEND
     16      * 三、Context.MODE_WORLD_READABLE
     17      * 四、Context.MODE_WORLD_WRITEABLE
     18      *
     19      * Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
     20      * Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
     21      * Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
     22      *
     23      * MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
     24      * MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
     25      *
     26      * 特别注意:出于安全性的考虑,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已经被弃用
     27      */
     28 
     29     /**
     30      * 保存数据
     31      */
     32     public static void putData(Context context, String key, Object object){
     33         //实例化SharedPreferences对象(第一步)
     34         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
     35         //实例化SharedPreferences.Editor对象(第二步)
     36         SharedPreferences.Editor editor = sp.edit();
     37         //用putObject的方法保存数据,取决于第三个参数你使用的什么类型的变量
     38         if (object instanceof Boolean){
     39             editor.putBoolean(key, (Boolean) object);
     40         }else if (object instanceof Float){
     41             editor.putFloat(key, (Float) object);
     42         }else if (object instanceof Integer){
     43             editor.putInt(key, (Integer) object);
     44         }else if (object instanceof Long){
     45             editor.putLong(key, (Long) object);
     46         }else if (object instanceof String){
     47             editor.putString(key, (String) object);
     48         }
     49         editor.apply();
     50     }
     51 
     52     /**
     53      * 获取指定数据
     54      */
     55     public static Object getData(Context context, String key, Object object){
     56         //实例化SharedPreferences对象(第一步)
     57         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
     58         //用getObject的方法保存数据,取决于第三个参数你使用的什么类型的变量(第二步)
     59         if (object instanceof Boolean){
     60             return sp.getBoolean(key, (Boolean) object);
     61         }else if (object instanceof Float){
     62             return sp.getFloat(key, (Float) object);
     63         }else if (object instanceof Integer){
     64             return sp.getInt(key, (Integer) object);
     65         }else if (object instanceof Long){
     66             return sp.getLong(key, (Long) object);
     67         }else if (object instanceof String){
     68             return sp.getString(key, (String) object);
     69         }
     70         return null;
     71     }
     72 
     73     /**
     74      * 返回所有的键值对
     75      */
     76     public static Map<String, ?> getAll(Context context){
     77         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
     78         Map<String, ?> map = sp.getAll();
     79         return map;
     80     }
     81 
     82     /**
     83      * 检查对应的数据是否存在
     84      */
     85     public static boolean contains(Context context, String key){
     86         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
     87         return sp.contains(key);
     88     }
     89 
     90     /**
     91      * 删除指定key值的数据
     92      */
     93     public static void remove(Context context, String key){
     94         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
     95         SharedPreferences.Editor editor = sp.edit();
     96         editor.remove(key);
     97         editor.apply();
     98     }
     99 
    100     /**
    101      * 删除所有的数据
    102      */
    103     public static void clear(Context context, String key){
    104         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
    105         SharedPreferences.Editor editor = sp.edit();
    106         editor.clear();
    107         editor.apply();
    108     }
    109 
    110 }

    版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
    作者By-----溺心与沉浮----博客园

  • 相关阅读:
    只要我跑的够快,内卷它就卷不到我,一名高中生是如何做到在疫情下涨薪70%的?
    一个@Transaction哪里来这么多坑?
    基于netty实现一个完整的TFTP服务器
    DBeaver安装和注意要点
    Logstash将ES服务器A数据迁移ES服务器B
    Logstash迁移ES5.6.1一个索引多type类型迁移到ES7.6.2无type类型
    windows下使用filezilla上传文件权限问题
    logstash7.6.2更新已存在的elasticsearch记录
    mysql磁盘空间不足报错
    Kibana中DevTools命令集锦
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11425441.html
Copyright © 2020-2023  润新知