Android Studio数据永久保存——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查看读取到的数据

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

扫描二维码关注公众号,回复: 10822989 查看本文章
        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查看读取到的数据

logcat数据
自命名数据库名称
自命名数据库内部内容

外部类访问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与数据库文件中的保存数据:
    logcat数据
    my_data

小结

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

发布了18 篇原创文章 · 获赞 1 · 访问量 330

猜你喜欢

转载自blog.csdn.net/qq_40509784/article/details/105341092
今日推荐