Android 中最简单的数据存储方式 : SharedPreferences

SharedPreferences 数据存储处理实际上时对一个个key——value 数据对的处理

使用SharedPreferences 保存key-value 对的一般步骤:

1. 使用Activity 类 的 getSharePreferences方法获取SharePreferences 对象,指定文件名和访问权限

2.获得SharePreferences.Editor 对象,并调用该对象的putXXX 方法保存key-value 对

3. 通过SharePreferences.Editor 的commit 方法提交保存 key-value 对

示例一:

认识并使用

 package com.example.sharedpreferences;

 import androidx.appcompat.app.AppCompatActivity;

 import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //SharedPreferences 接口
// 一个参数
SharedPreferences shp=getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor=shp.edit() ;
editor.putInt("NUMBER",100); // key -value
//均可 提交
//editor.commit();
//非同步提交
editor.apply(); int x =shp.getInt("NUMBER",0);
String TAG="mylog";
Log.d(TAG, "onCreate: "+x); }
}

运行程序之后,找到设备存储位置

打开 Mainactivity .xml  该文件名为默认的

会找到命名为 NUMBER 的 int 类型数据 数值为100

 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<int name="NUMBER" value="100" />
</map>

2.使用 getSharedPreferences  方法

 package com.example.sharedpreferences;

 import androidx.appcompat.app.AppCompatActivity;

 import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //SharedPreferences 接口
//两个参数
SharedPreferences shp = getSharedPreferences("MY_data",Context.MODE_PRIVATE);
// 一个参数
// SharedPreferences shp=getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor=shp.edit() ;
editor.putInt("NUMBER",6 00); // key -value
//均可 提交
//editor.commit();
//非同步提交
editor.apply(); int x =shp.getInt("NUMBER",0);
String TAG="mylog";
Log.d(TAG, "onCreate: "+x); }
}

存储为自定义名称的 xml 文件

2. 创建一个专门的数据类来管理数据

MyData类

 package com.example.sharedpreferences;

 import android.content.Context;
import android.content.SharedPreferences; public class MyData { public int number; private Context context;
public MyData(Context context){
this.context=context;
} public void save(){
String name=context.getResources().getString(R.string.MY_data);
SharedPreferences shp= context.getSharedPreferences(name,Context.MODE_PRIVATE);
SharedPreferences.Editor editor=shp.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);
SharedPreferences shp= context.getSharedPreferences(name,Context.MODE_PRIVATE);
String key=context.getResources().getString(R.string.MY_KEY);
//defValue : 缺省值
int x=shp.getInt(key,context.getResources().getInteger(R.integer.defValue));
number=x;
return x; } }

MainActivity.java

 package com.example.sharedpreferences;

 import androidx.appcompat.app.AppCompatActivity;

 import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 不好 this 表示 activity 的引用 有可能导致内存泄漏 activity 经常被摧毁重建
// MyData myData = new MyData(this);
// ApplicationContext() 可以理解为指向app的顶级引用 单个 永远存在的单例
MyData myData = new MyData(getApplicationContext()); myData.number=1000;
myData.save();
int y=myData.load();
String TAG="mylog";
Log.d(TAG, "onCreate: "+y); //SharedPreferences 接口
//两个参数
/* SharedPreferences shp = getSharedPreferences("MY_data",Context.MODE_PRIVATE);
// 一个参数
// SharedPreferences shp=getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor=shp.edit() ;
editor.putInt("NUMBER",600); // key -value
//均可 提交
//editor.commit();
//非同步提交
editor.apply(); int x =shp.getInt("NUMBER",0);
String TAG="mylog";
Log.d(TAG, "onCreate: "+x);*/ }
}

在编写程序当中,将某些变量设置在Resource 的Values 目录当中,便于数据管理,提高程序的可维护性

string.xml

<resources>
<string name="app_name">SharedPreferences</string>
<string name="MY_data">my_data</string>
<string name="MY_KEY">my_key</string>
</resources>

int.xml

 <?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="defValue">0</integer>
</resources>

Android Studio SharedPreferences的更多相关文章

  1. Android Studio快速集成讯飞SDK实现文字朗读功能

    今天,我们来学习一下怎么在Android Studio快速集成讯飞SDK实现文字朗读功能,先看一下效果图: 第一步 :了解TTS语音服务 TTS的全称为Text To Speech,即“从文本到语音” ...

  2. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  3. Android Studio 多个编译环境配置 多渠道打包 APK输出配置

    看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...

  4. Android Studio —— 重装 HAXM

    Android Studio -- 重装 HAXM 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. Android SDK 自带模拟器一直以慢.卡 ...

  5. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  6. 使用 Android Studio 检测内存泄漏与解决内存泄漏问题

    本文在腾讯技术推文上 修改 发布. http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BF ...

  7. 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值

    一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...

  8. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  9. android studio你可能忽视的细节——启动白屏?drawable和mipmap出现的意义?这里都有!!!

    android studio用了很久了,也不知道各位小伙伴有没有还在用eclipse的,如果还有,楼主真心推荐转到android studio来吧,毕竟亲儿子,你会知道除了启动速度稍微慢些,你找不到一 ...

随机推荐

  1. 114、Java中String类之字符串文本复杂二次拆分

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. gets和scanf区别

    scanf 和 gets 读取字符串 深入了解scanf()/getchar()和gets()等函数 scanf与gets函数读取字符串的区别 今天看到一段话,大致是说gets比scanf()快,有点 ...

  3. MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

    MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据) 分类: MySql5.x2014-06-23 15:16 1266人阅读 评论(0) 收藏 举报 mysql数据库 &l ...

  4. ASC码速记

    ASCII表规则记忆 我们仅仅要记住了一个字母或数字的 ASCII 码 (比如记住 A 为 65 , 0 的 ASCII 码为 48 ), 知道对应的大写和小写字母之间差 32. 0 -- 32 按键 ...

  5. topthink/think-swoole 扩展包的使用 之 Task

    本想自己适配的,奈何keng貌似不少,所以果断选择官方提供的包来适配233... 默认条件:thinkphp5.1.*版本下,且安装了swoole扩展 主要演示:task 任务的投递 友情提示:在sw ...

  6. 注意重写类的equals()方法

    注意在java中在比较引用类型时==和原生的equals()方法比较的都是看它们否是同一个对象(说的更直白一点就是他们在内存的位置是否是一样的),但我们在真实世界中关注的往往只是其中的某个属性是否相等 ...

  7. 「BJWC2012」冻结

    传送门 Luogu 解题思路 分层图最短路,层与层之间的边的边权减半,然后就是板子了. 细节注意事项 咕咕咕. 参考代码 #include <algorithm> #include < ...

  8. 本地Git仓库与GitHub/GitLab仓库同步

    本地仓库即为在你的电脑上的项目文件,远程仓库即为服务器仓库,如GitHub.GitLab或其他等.此处以GitHub介绍本地仓库与远程仓库的同步.可先创建本地仓库,也可先创建GitHub仓库,但都需要 ...

  9. Jquery事件汇总、网页入口

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:显示和隐藏内容

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...