数据永久保存——SharedPreferences

  • 关于数据存储:
    • 关于SharenPreferences
    • 外部类访问SharedPreferences的数据的操作:
      • 小结

本文为学习类文档,通过学习B站up主longway777的视频,如有侵权,请联系博主进行删除

关于数据存储:

关于数据存储,从前的Android提供了四种不同的存储方式分别为:

  1. 内部存储Internal file storage:APP沙盒内部存储,外部无法访问。
  2. 外部存储External file storage:允许外部访问,类似数据线连接对应的部分访问操作。
    越狱或者root之后,就没有内外部存储一说,代价为牺牲app文件私密性
  3. Shared Preferences:也属于一种内部存储,但只允许存储简单数据(int、float、bool、string等),将私有的原始数据以键-值对存储。
  4. 数据库Databases:Android支持SQLite数据库,可将数据存储在一个私有的数据库中。

但是今天从文档想要查看官方给的解释时!文档又又又改了!date:2020年4月6日查看

机翻:

  1. APP特定存储:存储仅供应用程序使用的文件,可以存储在内部存储卷中的专用目录中,也可以存储在外部存储卷中的不同专用目录中。使用内部存储的目录来保存其他应用程序不应该访问的敏感信息。

  2. 共享存储:存储应用程序打算与其他应用程序共享的文件,包括媒体、文档和其他文件。

  3. ferences:将私有的原始数据存储在键-值对中。

  4. 数据库:使用Room persistence库将结构化数据存储在私有数据库中。
    由此看来Preferences应该还是和之前的SharedPreferences一样,只不过重命名了而已。,所以下面还是以SharedPreferences来复习

关于SharenPreferences

查看Device File Explorer(位于as的右下角处)

路径:Data->data->package名->

通过写一个数据来查看数据存储情况

  1. 新建一个项目
  2. 在项目中的controller填写代码
    使用SharedPreferences的getPreferences()方法:
        SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE);        //新版as已经删除了Context.MODE_WORLD_READABLE,Context.MODE_WORLD_WRITEABLE        SharedPreferences.Editor editor = sharedPreferences.edit();        editor.putInt("NUMBER",100);//文件中会被写进一个KEY为100的数据        //editor.commit();//提交        editor.apply();//提交,建议使用apply(),其使用的是非同步方式提交操作,可避免冲突
  1. 运行项目后查看文件系统,可看到多出来一个文件夹,里面还有包含数据的xml文件(没有看到的在包名处右键刷新Synchronize即可):

    打开MainActivity.xml可以看到数据:
  2. 读取情况(将数据用Logcat查看):
//数据读取        int x = sharedPreferences.getInt("NUMBER",0);//两个参数,要给出缺省值,如果为空赋值0        String TAG = "myLog";        Log.d(TAG, "onCreate: " + x); //可在Logcat中搜索myLog查看读取到的数据


5. 使用getSharedPreferences()效果一致,以自命名的数据库文件存入相应数据:

        SharedPreferences sharedPreferences = getSharedPreferences("MY_DATA",Context.MODE_PRIVATE);//两个参数,一是名称,二是MODE        SharedPreferences.Editor editor = sharedPreferences.edit();        editor.putInt("NUMBER",600);//文件中会被写进一个KEY为600的数据        editor.apply();//提交,建议使用apply(),其使用的是非同步方式提交操作,可避免冲突        //数据读取        int x = sharedPreferences.getInt("NUMBER",0);//两个参数,要给出缺省值,如果为空赋值0        String TAG = "myLog";        Log.d(TAG, "onCreate: " + x); //可在Logcat中搜索myLog查看读取到的数据



外部类访问SharedPreferences的数据的操作:

  1. 创建一个Model,命名为MyData.class。
  2. 在类中填写代码:
package com.example.sharedpreferences;import android.content.Context;import android.content.SharedPreferences;public class MyData {    public int number;    //定义一个域类型为Context,用以实现访问SharedPreferences    private Context context;    //通过构造函数传递    public MyData(Context context){        this.context = context;    }    public void save(){        //SharedPreferences sharedPreferences = context.getSharedPreferences("MY_DATA",Context.MODE_PRIVATE); //"MY_DATA"存在hard coded的警告隐患        //在resource中创建strins资源较为合适        String name = context.getResources().getString(R.string.MY_DATA);//在Activity外部无法直接getString();        SharedPreferences sharedPreferences = context.getSharedPreferences(name,Context.MODE_PRIVATE);        //写操作        SharedPreferences.Editor editor = sharedPreferences.edit();        //同理创建资源;        String key = context.getResources().getString(R.string.MY_KEY);        editor.putInt(key,number);        editor.apply();    }    public int load(){        String name = context.getResources().getString(R.string.MY_DATA);//在Activity外部无法直接getString();        SharedPreferences sharedPreferences = context.getSharedPreferences(name,Context.MODE_PRIVATE);        String key = context.getResources().getString(R.string.MY_KEY);        int x = sharedPreferences.getInt(key,context.getResources().getInteger(R.integer.defValue));        number = x;        return x;    }}
  1. 在controller中onCreate()中补充:
        MyData myData = new MyData(getApplicationContext());//ApplicationContext可理解为指向APP的顶级引用,较为安全        myData.number = 1000;        myData.save();        int y = myData.load();        String TAG = "myLog";        Log.d(TAG, "onCreate: " + y); //可在Logcat中搜索myLog查看读取到的数据
  1. 运行项目查看logcat与数据库文件中的保存数据:

小结

在controller中对数据不进行操作,全部放在My_Data类中,由于是外部引用所以需要传递过来,在其中创建有参(context类型)构造函数,使其具备访问全局资源的能力。定义两个方法save()与load(),将常量存放在资源中,使程序维护性更高。

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. 使用ContentProvider(内容提供者)共享数据
  4. Android数据库(SQLite)的简单使用——增、删、查改功能的简单实现
  5. Ionic Cordova实现软键盘的监听 以及操作大全
  6. ListView的Adapter使用(绑定数据) 之 自定义每一项的布局去绑定
  7. Android(安卓)SQLite数据库使用INTO子句创建新表时报错
  8. Android(安卓)中能够作为 Log 开关的一些操作以及安全性浅谈
  9. Andriod Service

随机推荐

  1. Android(安卓)设置透明按钮
  2. Android官网无法下载eclipse-adt-bundle
  3. 自定义ListView下方分割线
  4. Android文件操作
  5. android中自定义ProgressBar水平样式
  6. Android(安卓)Handler简单例子
  7. 分享方法:android 获得屏幕状态
  8. Android(安卓)5.0 parseSdkContent faile
  9. Android(安卓)中常用代码片段
  10. android dumpsys