您的位置:首页 > 移动开发 > Android开发

Android Studio数据永久保存——SharedPreferences

2020-04-23 09:16 1401 查看

数据永久保存——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(),将常量存放在资源中,使程序维护性更高。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Lin_Stack 发布了25 篇原创文章 · 获赞 1 · 访问量 685 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: