-
2015-09-22 20:24:28
今天我们讲下SharedPreferences的使用,就是读取或写入数据到内存中,比较简单,我们直接看代码吧。
package com.example.sharedpreferences_01; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.util.Log; import android.view.Menu; public class MainActivity extends Activity { private SharedPreferences pref; Editor editor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化一个SharedPreferences对象 pref = getSharedPreferences("myPref", MODE_PRIVATE); //实例化editor对象的方法 editor = pref.edit(); //存放数据 editor.putString("name", "张三"); editor.putInt("age", 20); editor.putBoolean("isMarry", false); editor.putLong("time", System.currentTimeMillis()); editor.commit(); editor.remove("time"); editor.commit(); Log.i("main", pref.getString("name", "")); //获取数据 Log.i("main", "" + pref.getInt("age", 0)); } }
更多相关内容 -
Android使用SharedPreferences存储XML文件的实现方法
2020-09-02 01:00:54主要介绍了Android使用SharedPreferences存储XML文件的实现方法,实例分析了SharedPreferences类的基本初始化与文件存储相关技巧,需要的朋友可以参考下 -
使用SharedPreferences读写数据的步骤
2018-06-15 11:23:04一、写入数据: 1、调用Context对象的getSharedPreferences(文件名,文件的操作模式)得到SharedPreferences对象 this.sharedPreferences=this.getSharedPreferences(fileName, Context.MODE_PRIVATE); 2、调用...一、写入数据:
1、调用Context对象的getSharedPreferences(文件名,文件的操作模式)得到SharedPreferences对象
this.sharedPreferences=this.getSharedPreferences(fileName, Context.MODE_PRIVATE);
2、调用SharedPreferences对象的edit()方法得到Editor对象
SharedPreferences.Editor editor=this.sharedPreferences.edit();
3、调用编辑器对象的putXXX(key,value)设置需要保存的数据
editor.putString("userName",userName);
4、调用编辑器对象的commit()方法提交数据
editor.commit();
二、读取数据:
1、调用Context对象的getSharedPreferences(文件名,文件的操作模式)得到SharedPreferences对象
this.sharedPreferences=this.getSharedPreferences(fileName, Context.MODE_PRIVATE);
2、调用SharedPreferences对象的getXXX(key,[默认值])根据指定的键获取数据,如果键不存在则返回默认值
String userName=this.sharedPreferences.getString("userName","");
注意:this.sharedPreferences=this.getSharedPreferences(fileName, Context.MODE_PRIVATE)中:
第一个参数为文件名,文件名不用加扩展名,系统会自动加上.xml扩展名
第二个参数:
Context.MODE_PRIVATE=0:代表当前文件只能供本应用程序使用,其它应用程序无法访问本文件.每次写入新数据时都会覆盖之前写的数据。
Context.MODE_APPEND:追加模式,代表当前文件只能供本应用程序使用,其它应用程序无法访问本文件,但每次写入新数据会追加到之前数据的后面。
Context.MODE_WORLD_READABLE=1:只读模式,代表当前文件所有应用程序都可以读取,但不能写入数据。
Context.MODE_WORLD_WRITEABLE=2:写入模式,代表当前文件所有应用程序都可以写入数据,但不能读取数据。
实现读写模式:
Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE=3
Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE=3 -
Android-SharedPreferences 读取写入
2020-08-14 10:17:30SharedPreferences 提供永久存储本地键值对的功能 1.读取 share.getString("account","");//第二个参数是获取不到内容适合返回的 2.设置 editor.putString("account",accountStr);//可以设置多种基本类型数据 ...SharedPreferences 提供永久存储本地键值对的功能
1.读取 share.getString("account","");//第二个参数是获取不到内容适合返回的
2.设置 editor.putString("account",accountStr);//可以设置多种基本类型数据
多种操作模式
-
Activity.MODE_PRIVATE,//默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Activity.MODE_APPEND
-
Activity.MODE_WORLD_READABLE,//表示当前文件可以被其他应用读取,
-
Activity.MODE_WORLD_WRITEABLE,//表示当前文件可以被其他应用写入;
-
//如果希望文件被其他应用读和写,可以传入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE
package com.example.handleproject; import androidx.appcompat.app.AppCompatActivity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class SharePreerenceActivity extends AppCompatActivity { private TextView account; private TextView pass; private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_share_preerence); account=findViewById(R.id.account); pass=findViewById(R.id.pass); btn=findViewById(R.id.button); SharedPreferences share=getSharedPreferences("setting",MODE_PRIVATE); String accStr=share.getString("account","");//第二个参数是获取不到内容适合返回的 String pwdStr=share.getString("pass",""); account.setText(accStr); pass.setText(pwdStr); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String accountStr=account.getText().toString(); String passStr=pass.getText().toString(); if(accountStr.equals("admin")&&passStr.equals("123456")){ //1、打开Preferences,名称为setting,如果存在则打开它,否则创建新的Preferences SharedPreferences settings = getSharedPreferences("setting", MODE_PRIVATE); //2、让setting处于编辑状态 SharedPreferences.Editor editor = settings.edit(); //3、存放数据 editor.putString("account",accountStr); editor.putString("pass",passStr); //4、完成提交 editor.commit(); Toast.makeText(SharePreerenceActivity.this,"保存成功",Toast.LENGTH_SHORT).show(); } else{ Toast.makeText(SharePreerenceActivity.this,"请输入admin&&123456",Toast.LENGTH_SHORT).show(); } } }); } }
androidStudio查看存储的文件地址
做了上面的操作,其实他的本质是个文件存储操作,可以在编辑器查看最终存储的内容以及位置
在菜单栏 view->tool-window->device-file-explorer里面可以打开文件管理器
在data/data/[包名]、shared_refs 里面可以找到文件setting.xml和我们做的存储操作
SharedPreferences settings = getSharedPreferences("setting", MODE_PRIVATE);
红色字体部分是一样的,也就是表示setting其实就是我们存储数据的一个文件名,如果想在新的文件存储数据,就换一个新的文件名
-
-
Android文件读写 - SharedPreferences
2019-12-25 22:14:12由于项目需要使用到涉及到Android文件的保存及读取,那就学呗。 原先的计划是使用文本进行保存,数据格式使用Json。 后面发现了SharedPreferences存储,一步到位,我喜欢。 内存&外存 1 开始之前,我们先来区分...前言
由于项目需要使用到涉及到
Android文件的保存及读取
,那就学呗。
原先的计划是使用文本
进行保存,数据格式使用Json
。
后面发现了SharedPreferences存储
,一步到位,我喜欢。
内存&外存 1
开始之前,我们先来补充一下安卓中
内部存储
及外部存储
的概念。
当然标题所说的内存
并不是手机上的运行内存
…而是指手机的内部存储
。内部存储
位于系统中很特殊的一个位置,如果你想将文件存储于内部存储
中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录
下。也就是说应用创建于内部存储
的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储
中的这些文件也被删除。至于外部存储,在
4.4(API19)
之前,将手机自身带的存储卡划分为内部存储
,而扩展的SD卡
就是外部存储
。但是从Android4.4
开始,Google
将机身存储(内置存储)
在概念上分成了内部存储 (internal)
和外部存储 (external)
两部分。
那么怎么区分机身存储
的外部存储
跟SD卡
的外部存储
呢?对,SD卡
也是外部存储
,那怎么区分呢,在Android 4.4
以后的系统中,API
提供了这样一个方法来遍历手机的外部存储路径:File[] files; //API > 19(Android 4.4) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { files = getExternalFilesDirs(Environment.MEDIA_MOUNTED); for(File file:files){ Log.e("main", String.valueOf(file)); } }
荣耀小7遍历结果:
可以看到它们都位于/storage
下:/storage/emulated/0
是机身存储/storage/BE16-1E17
是外部存储
关于文件路径,可能需要先了解一下
linux文件挂载
,这里不展开。由于
内部存储
相对于外部存储
更外宝贵,因而文件存储的常规操作是:先检测有无外部存储(SD卡),无外部存储时再使用机身存储。SharedPreferences
不同于文件存储,
SharedPreferences
使用键值对
的形式保存,即在保存时需要提供一个字符串作为键值,在读取数据时就可以通过键值把对应的数据读取出来。官方文档提醒您:该类不支持跨进程使用。
存储格式:XML
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <!--类型 name = "键值" value = "数据"/--> <int name="25" value="625" /> </map>
保存
想要使用
SharedPreferences
进行存储,首先需要获取到SharedPreferences对象
。上面的例子,使用的是
Context类
中的getSharedPreferences()
方法。SharedPreferences getSharedPreferences (String name,int mode)
其他参数如下:
-
name
:文件名,如果指定的文件不在,则会创建一个。 -
mode
:模式,目前只有MODE_PRIVATE
一种可选项,当然使用0
的效果也是一样的。MODE_PRIVATE
:只有当前应用程序
才能对这个SharedPreferences
文件进行读写。MODE_WORLD_READABLE
:Android 4.2+ 弃用MODE_WORLD_WRITEABLE
:Android 4.2+ 弃用MODE_MULTI_PROCESS
:Android 6.0+ 弃用
除此之外,我们还可以通过以下方法获取
SharedPreferences对象
:
Activity
类的getPreferences()
方法。SharedPreferences getPreferences(@Context.PreferencesMode int mode)
该方法与
getSharedPreferences()
类似,但它只有一个参数mode
,文件名则是当前Activity
的类名。取得
SharedPreferences对象
后,我们可以通过edit()
方法获取其Edit对象
,通过Edit对象
可以修改内存中的SharedPreferences
的数据,再原子地提交到硬盘SharedPreferences
。(没有理解错的话)例如我们要添加文本数据,则使用
putString()
;需要添加整型数据,则使用putint()
…就不一一列举了。此外,
Edit类
还为我们提供了clear()
方法以清空数据。修改完以后就是
提交
,目前提交有两种方法:apply()
:立即将其更改提交到内存
,对机身存储进行异步提交,且不会收到任何故障警告。commit()
:同步地写到持久性存储SharedPreferences
中,因此我们应避免在主线程中直接使用它。
下面给出一个简单的文件保存示例:
sharedPreferences = getSharedPreferences("SharedPreferences", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("test",editText.getText().toString()); editor.apply(); //editor.commit();
保存路径(需root用户才能看到)
那么保存的文件存储再哪里呢?
目前使用模拟器寻得的路径为:
/data/data/pagename(包名)/shared_prefs
而在未获取root权限
的手机上是无法直接查看到该文件的。而目前接触的真机基本都是
未获取root权限
的;手机上看不到文件,心里虚得慌怎么办?放心,我们可以在读取文件的地方
debug
一下,直接查看获取到的SharedPreferences对象
。
可以发现,该demo
在荣耀小7
上运行时,文件是存储在机身存储
上的。读取
可能要让你失望了,读取的方法比保存更为简单。
首先同样是取得
SharedPreferences对象
,这点和上面是一样的。随后我们就可以通过
get()
方法取得我们所需要的数据(只要它在SharedPreferences中)。每一个
Editor
的put()
方法,在SharedPreferences
中都能找到一个get()
方法将数据取出。下面直接看例子:
String value = sharedPreferences.getString("test","Null"); textView.setText(value);
demo效果
这是在学习之前,自己问自己的问题,这里给出答案
Q:保存为同名
SharedPreferences文件
,会造成文件覆盖吗?
若文件已存在则不会覆盖,而是追加内容。
若追加同键值内容则会造成覆盖,否则添加新的键值对。局限性 2:
SharedPreferences
虽好,但不可滥用-
value
内容不宜过大-
第一次从
SharedPreferences
中获取值的时候,有可能阻塞主线程
,使界面卡顿、掉帧。 -
解析
SharedPreferences
的时候会产生大量的临时对象
,导致频繁GC,引起界面卡顿。 -
这些
key
和value
会永远存在于内存
之中,不会被释放。
-
-
存储
JSON
等特殊符号很多的value
JSON
或者HTML
格式存放在SharedPreferences
里面的时候,需要转义,这样会带来很多&
这种特殊符号,SharedPreferences
在解析碰到这个特殊符号的时候会进行特殊的处理
,引发额外的字符串拼接以及函数调用开销。
-
多次
edit()
多次apply()
- 每次
edit()
都会创建一个Editor对象
,额外占用内存
;当然多创建几个对象也影响不了多少;但是,多次apply()
也会卡界面你造吗?
- 每次
-
至于
跨进程
,这个SharedPreferences类
开篇就澄清了, 不支持跨线程。
而容易让人引起误解的MODE_MULTI_PROCESS
模式也于Android6.0弃用
了。
结语
本文只是简单的介绍了如何使用
SharedPreferences
进行文件的读写。在此需要注意的是,当设备内部空间不足时,Android
可能会删除缓存文件回收空间,但是我们不应该依赖系统为我们清理这些文件,而应始终自行维护缓存文件,使其占用空间保持在合理的范围内(例如1M)。因此我的操作是,每次打开文件写入前,先用clear()
清空。由于博主才疏学浅,若发现文章内容有误,欢迎各位大佬留言指正,不吝赐教。
Demo源码下载地址
百度云地址 - 提取密码:cca3
参考鸣谢
-
android开发基础教程—SharedPreferences读写
2020-09-05 15:59:22本文介绍SharedPreferences的读与写的实现思路,感兴趣的朋友可以了解下 -
使用SharedPreferences读写数据
2013-07-02 01:34:40随时随地阅读更多技术实战干货,获取...1.SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此它保存的数据主要是简单类型的键值对。SharedPreferences接口提供了如下常用方法来访问SharedPreference... -
SharedPreferences保存文件及文件读取
2015-05-08 11:50:07在用普通的方法同时保存用户名和密码时,中间必须要有一个分隔符来区分用户名和密码,... 用SharedPreferences保存文件的方法就可以解决这个问题: Context context=new Context(); SharedPreferences sp= context -
android中SharedPreferences实现xml配置文件的数据存取
2022-04-13 17:32:01} /** * 获取用户信息 * @param context 调取上下文信息 * @return */ public static User getUserInfo(Context context){ SharedPreferences sp=context.getSharedPreferences(Constant.SP_FILE_NAME,Context.MODE... -
数据存储方案(一) - 文件存储、SharedPreferences存储
2022-06-08 14:49:33目录 文件存储 保存数据 保存输入框中的数据 读取数据 SharedPreferences存储 获取SharedPreferences对象 使用SharedPreferences保存数据 读取SharedPreferences数据 SQLite数据库存储 文件存储 文件存储是 Android ... -
Android编程之SharedPreferences文件存储操作实例分析
2020-09-03 19:38:27主要介绍了Android编程之SharedPreferences文件存储操作方法,实例分析了SharedPreferences文件操作的相关技巧,非常具有实用价值,需要的朋友可以参考下 -
安卓开发学习——6.练习SharedPreferences用法和文件IO
2021-01-03 17:16:31代码如下,submit按键测试SharedPreferences功能,存储的是程序启动的次数,write按键是写入文本文件,read按键是将文本内容写入标题栏。 xml代码: Activity.java代码: package com.example.myapplication... -
Android(数据存储:文件存储、SharedPreferences)验证QQ密码
2021-01-03 13:56:13前情提要2 :动态页面-简单保存QQ密码(数据存储:文件存储、SharedPreferences) 【https://blog.csdn.net/weixin_44949135/article/details/104965413】 验证QQ密码 ,在前情提要2的基础上,实现了如下功能: ... -
Android 文件存储和 SharedPreferences 存储
2021-10-23 15:20:15持久化技术简介 ...文件存储是 Android 中最基本的数据存储方式,它不对存储的内容进行格式化处理,所有数据都是原封不动的保存到文件当中,适合存储一些简单的文本数据或二进制数据 Context 类提供了一个 ope. -
android 使用SharedPreferences对数据存储/删除/读取/文件删除
2017-04-04 13:51:22android 使用SharedPreferences对数据存储/删除/读取/文件删除 -
Android开发SharedPreferences使用及调用文件管理器自定义读取文件实现
2014-12-01 13:59:56SharedPreferences 保存读取数据, 使用AutoCompleteTextView 和SharedPreferences 实现历史记录提示。调用文件管理器自定义路径读取文件 -
SharedPreferences存储
2021-09-13 14:58:243. 读取SharedPreferences文件中存储的数据 4.运用 Android系统提供了轻量级的数据存储方式——SharedPreferences存储。它屏蔽了对底层文件的操作,通过为程序开发人员提供简单的编程接口,实现以最简单的方式对... -
Android 数据存储详解(SharedPreferences, 文件, Sqlite, ContentProvider)
2016-07-21 21:22:39SharedPreferences sharepreferences是Android中最轻量级的数据存储. 原理相信很多人也很清楚, 这里简单再介绍以下. 系统提供了SharedPreferences这个类, 所有用这个类存储的内容都会放在 data/data/... -
android文件存储和SharedPreferences存储实例
2022-05-15 14:50:48【文件存储】中查看设备保存的文件: 目录 activity_main <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app=... -
数据持久化技术:文件存储、SharedPreferences存储以及数据库存储
2022-04-01 07:52:19文件存储 这里实现了一个存储EditText中输入内容与恢复 package com.example.filepersistencetest import android.content.Context import androidx.appcompat.app.AppCompatActivity import android.os.Bundle ... -
SharedPreferences自定义XML文件保存位置
2016-12-27 15:03:20声明:本篇文章的相关...前言:因为之前的文件是保存在项目目录下的,所以只要软件卸载了,本地的XML也就没有了,所以需要一个把XML文件存在外面的方法,方法不过于重写、自己再写一个新的XML存取类。但是我发现了Ha -
SharedPreferences存储数据及文件数据存储
2020-06-21 18:07:23SharedPreferences存储数据及文件数据存储什么是内部、外部存储内部存储获得路径方法SharedPreferences存储外部存储获得公共目录方法文件读写 什么是内部、外部存储 内部存储 获得路径方法 context.getCacheDir() ... -
Android SharedPreferences
2021-01-03 16:57:11Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。 MODE_WORLD_READABLE:表示当前文件可以被其他应用读取; MODE_WORLD_WRITEABLE:表示当前文件可以被其他... -
Android文件读写和使用SharedPreferences储存数据
2017-01-31 10:21:01程序的终归目的还是操作数据来达到实现一些特定功能,在Android中,我们可以通过操作文件或者使用SharedPreferences还有数据库来保存一些数据。首先来看一下Android文件的读写:假设我们现在有这么一个需求:一个... -
SharedPreferences的存储位置和格式
2021-06-03 14:03:281.SharedPreferences 本身是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name,int ...PRIVATE:指定该SharedPreferences数据只能被应用程序读写(2).Conte... -
XML文件保存配置数据--读取配置数据->SharedPreferences
2022-01-20 15:08:30界面文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android=... -
数据存储之SharedPreferences存储
2021-01-03 16:39:14因此,我们来学习一下Android的另外一种存储方式,SharedPreferences存储,它是一种数据持久化的方式,它比文件存储更加简单易用。 将数据存储到SharedPreferences中 不同于文件存储的方式,SharedPreferences是使用... -
读写SharedPreferences中的数据
2017-07-06 15:54:12对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件进行保存。如果是Android应用,我们最适合采用什么方式保存软件配置参数呢? Android... -
Android性能优化之SharedPreferences
2020-11-11 20:24:01SharedPreferences 系列 《Android 之不要滥用 SharedPreferences》 《Android 之不要滥用 SharedPreferences(2)— 数据丢失》 ContentProvider 系列(待更) 《Android 存储选项之 ContentProvider 启动过程源码... -
Android:无法为SharedPreferences文件创建目录
2021-06-08 14:04:09我正在尝试通过另一个应用程序编辑一个应用程序的SharedPreferences ,我的代码是这样的try { Context plutoContext = getApplicationContext().createPackageContext("me.test",Context.MODE_WORLD_WRITEABLE);...