Android_存储之SharedPreferences

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android_存储之SharedPreferences
⼀、概述
SharedPreferences是⼀种轻量级的数据存储⽅式,采⽤键值对的存储⽅式。

SharedPreferences只能存储少量数据,⼤量数据不能使⽤该⽅式存储,⽀持存储的数据类型有booleans, floats, ints, longs, and strings。

SharedPreferences存储到⼀个XML⽂件中的,路径在/data/data/<packagename>/shared_prefs/下,⽂件名以及存储后⾯详细讲述。

⼆、基本⽤法
1.获取SharedPreferences对象
要创建存储⽂件或访问已有数据,⾸先要获取SharedPreferences才能进⾏操作。

获取SharedPreferences对象有下⾯两个⽅式:
(1)getSharedPreferences(String name, int mode) --- 通过Context调⽤该⽅法获得对象。

它有两个参数,第⼀个name 指定了SharedPreferences存储的⽂件的⽂件名,第⼆个参数mode 指定了操作的模式。

这种⽅式获取的对象创建的⽂件可以被整个应⽤所有组件使⽤,有指定的⽂件名。

(2)getPreferences(int mode) --- 通过Activity调⽤获得对象。

它只有⼀个参数mode 指定操作模式。

这种⽅式获取的对象创建的⽂件属于Activity,只能在该Activity中使⽤,且没有指定的⽂件名,⽂件名同Activity名字。

如:
mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE );
---创建的⽂件名是,testContextSp.xml
mActivitySp = this.getPreferences( Context.MODE_PRIVATE );
---创建的⽂件名是,MainActivity.xml(该Activity叫MainActivity)
操作模式(mode):
两个⽅式都有⼀个mode参数,mode具体有4个值,最新的只能使⽤默认模式 Context.MODE_PRIVATE。

Context.MODE_PRIVATE(0):默认模式,创建的⽂件只能由调⽤的应⽤程序(或者共享相同⽤户ID的应⽤程序)访问。

后⾯3种已不推荐使⽤。

从下⾯⽂档说明中看到,这些情况的操作最好使⽤ContentProvider, BroadcastReceiver, Service.
这些在前⾯四⼤组件中详细写过,最后⾯附上链接:
2.数据更新
SharedPreferences添加或更新数据,通过SharedPreferences 获取 SharedPreferences.Editor,操作⽂件数据,最后通过commit()或apply()提交修改。

如下:
SharedPreferences mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE );
SharedPreferences.Editor editor = mContextSp.edit();
editor.putInt( "age", 28);
editor.putBoolean( "isStudent", false );
editor.putString( "job", "it" );
mit();
操作后,在对应应⽤路径下有创建testContextSp.xml。

具体⼿机⾥的数据如下。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="job">it</string>
<int name="age" value="28" />
<boolean name="isStudent" value="false" />
</map>
commit()和apply()区别:
apply()⽴即更改内存中的SharedPreferences对象,但异步地将更新写⼊磁盘。

commit()同步地将数据写⼊磁盘。

commit()是同步的,在主线程调⽤它应该多注意,因为可能引起阻塞,引起ANR。

commit()有返回值,返回是否成功写⼊永久性存储种。

apply()没有返回值。

(3)数据获取。

通过SharedPreferences提供的getInt(),getString()等⽅法获取⽂件中的数据,如果数据不存在,则返回⼀个默认值。

如:
mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE );
String name = mContextSp.getString( "name", "bbb" );
int age = mContextSp.getInt( "age", 0 );
boolean isStudent = mContextSp.getBoolean( "isStudent", false );
三、简单实例
⼀个Activity⾥3个按钮,AddData UpdateData getData,具体代码如下,让我们看看操作后⼿机中的数据变化。

MainActivity.java
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
SharedPreferences mContextSp;
SharedPreferences mActivitySp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( yout.activity_main );
mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE );
mActivitySp = this.getPreferences( Context.MODE_PRIVATE );
mActivitySp.edit().commit();//only create file
Button addBtn = findViewById( R.id.add_data_btn );
addBtn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = mContextSp.edit();
editor.putString( "name", "aaa" );
editor.putInt( "age", 18);
editor.putBoolean( "isStudent", true );
mit();
}
} );
Button updateBtn = findViewById( R.id.update_data_btn );
updateBtn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = mContextSp.edit();
editor.putInt( "age", 28);
editor.putBoolean( "isStudent", false );
editor.putString( "job", "it" );
mit();
}
} );
Button getDataBtn = findViewById( R.id.get_data_btn );
getDataBtn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = mContextSp.getString( "name", "bbb" );
int age = mContextSp.getInt( "age", 0 );
boolean isStudent = mContextSp.getBoolean( "isStudent", false );
Log.d( "sp_test", "name="+name+";age="+age+";isStudent="+isStudent);
}
} );
}
}
布局⽂件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button android:id="@+id/add_data_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="AddData"/>
<Button android:id="@+id/update_data_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="UpdateData"/>
<Button android:id="@+id/get_data_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="getData"/>
</LinearLayout>
具体操作及现象:
启动应⽤,mActivitySp.edit().commit(); 通过getPreferences()获取的SharedPreferences对象创建了⼀个不指定名称的xml⽂件,⽂件名同Activity名字,没写⼊任何数据。

点击AddData 添加数据, 然后点击getData 获取数据。

getData打印出的log:
2019-08-22 10:49:41.626 21272-21272/com.flx.testsharedpreferences D/sp_test: name=aaa;age=18;isStudent=true
获取的数据和⼿机中数据是⼀致的。

 
点击UpdateData 更新数据,在点击getData 获取数据。

getData打印的数据:
2019-08-22 10:53:01.580 21272-21272/com.flx.testsharedpreferences D/sp_test: name=aaa;age=28;isStudent=false。

相关文档
最新文档