在移动应用中,经常会遇到要读取、存储少量数据的场景,如果使用数据库就有点杀鸡用牛刀的感觉。还好,Android为开发人员提供了一个叫 SharedPreferences 的机制,可以用于存储这样的数据。
一个 SharedPreferences 是一个轻量级的存储类,它是用xml文件存放数据,文件存放在/data/data/应用包名/shared_prefs 目录下。SharedPreferences 可用于存储 int、boolean、float、long、String、StringSet 等多种数据类型的数据。
保存数据
要保存数据,需要执行以下步骤:
- 获得SharedPreferences对象实例,这个任务是通过调用 getSharedPreferences 来完成的:
1
| SharedPreferences settings = getSharedPreferences(“AppSettings”, Context.MODE_PRIVATE);
|
其中:
第一个参数是为 SharedPreferences 指定的名字,
第二个参数是 SharedPreferences 的操作模式,常用的取值为:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
- 开启编辑模式,设置数据,然后提交更改
1 2 3
| settings.edit() .putString("theme", txtTheme.getText().toString()) .commit();
|
在示例中,模拟了从界面读取信息存入到 SharedPreferences 的场景
读取数据
- 获得SharedPreferences对象实例,这个任务是通过调用 getSharedPreferences 来完成的:
1
| SharedPreferences settings = getSharedPreferences(“AppSettings”, Context.MODE_PRIVATE);
|
- 调用对应数据类型的get方法
1 2
| SharedPreferences settings = getSharedPreferences(SHARED_PREFS_NAME, 0); String theme = settings.getString("theme", "");
|
完整的示例代码如下:
布局文件: activity_shared_prefs.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".SharedPrefsActivity">
<Button android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="Save" app:layout_constraintEnd_toEndOf="@+id/txtTheme" app:layout_constraintStart_toStartOf="@+id/txtTheme" app:layout_constraintTop_toBottomOf="@+id/txtTheme" />
<Button android:id="@+id/btnLoad" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="Load" app:layout_constraintEnd_toEndOf="@+id/btnSave" app:layout_constraintStart_toStartOf="@+id/btnSave" app:layout_constraintTop_toBottomOf="@+id/btnSave" />
<EditText android:id="@+id/txtTheme" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="98dp" android:layout_marginTop="81dp" android:layout_marginEnd="98dp" android:ems="10" android:inputType="textPersonName" android:text="Name" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
|
类文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class SharedPrefsActivity extends AppCompatActivity {
private static final String TAG = SharedPrefsActivity.class.getSimpleName();
private static final String SHARED_PREFS_NAME = "AppSettings";
@BindView(R.id.txtTheme) EditText txtTheme;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shared_prefs);
ButterKnife.bind(this); }
@OnClick(R.id.btnSave) void onSave() {
SharedPreferences settings = getSharedPreferences(SHARED_PREFS_NAME, Context.MODE_PRIVATE ); settings.edit() .putString("theme", txtTheme.getText().toString()) .commit(); }
@OnClick(R.id.btnLoad) void onLoad() {
SharedPreferences settings = getSharedPreferences(SHARED_PREFS_NAME, 0); String theme = settings.getString("theme", ""); txtTheme.setText(theme); } }
|