0%

Android数据存储

引入

作为一个完整的应用程序,不可能每一次手机重启了,整个应用程序就和刚下载时候一样,因此数据的存储与操作是必不可少的。Android 系统为我们提供了4种数据存储方式,分别是:SharedPreference、SQLite、ContentProvider 和文件。


1. SharedPreference 存储:

本质就是基于 xml 文件存储键值对数据,通常用来存储一些简单的配置信息。

(1) getPreferences,文件名与 Activity 名一致,是该 Activity 独有的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.example.sharedpreference;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences shp = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
editor.putInt("data", 1234);
editor.apply();
}
}

数据被写入到 /data/data/package(包名)/shared_prefs/MainActivity.xml 中

1
2
3
4
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<int name="data" value="1234" />
</map>

​ (2) getSharedPreferences 与 (1)类似,可以自己设置文件名, 而且是共享的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.example.sharedpreference;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences shp = getSharedPreferences("SavedData", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
editor.putInt("data", 8888);
editor.apply();
}
}

数据被写入到 /data/data/package(包名)/shared_prefs/SavedData.xml 中

1
2
3
4
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<int name="data" value="8888" />
</map>

运用到ViewModel中

ViewModel部分

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
43
44
45
package com.example.androidviewmodel;


import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;

import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.SavedStateHandle;
import androidx.lifecycle.ViewModel;

public class MyViewModel extends AndroidViewModel {
private SavedStateHandle handle;

public MyViewModel(Application application, SavedStateHandle handle) {
super(application);
this.handle = handle;
if (!handle.contains(MainActivity.KEY_NAME)) {
load();
}
}

public LiveData<Integer> getNumber(){
return handle.getLiveData(MainActivity.KEY_NAME);
}

public void load(){
SharedPreferences shp = getApplication().getSharedPreferences("data", Context.MODE_PRIVATE);
handle.set(MainActivity.KEY_NAME, shp.getInt(MainActivity.KEY_NAME, 0));
}

public void save(){
SharedPreferences shp = getApplication().getSharedPreferences("data", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
editor.putInt(MainActivity.KEY_NAME, handle.get(MainActivity.KEY_NAME));
editor.apply();
}

public void add(int x){
handle.set(MainActivity.KEY_NAME, getNumber().getValue() + x);
}
}

MainaActivity部分

这里 viewModel.save() 之所以放在onPause() 中,是因为比较保险,如果放在 add() 中,每加一次都进行一次读写操作,开销会比较大,而如果放在onStop() 或 onDestory() 中,又会面临着万一出现意料以外的问题没有调用这两个方法导致数据丢失就比较尴尬了。

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
package com.example.androidviewmodel;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.SavedStateViewModelFactory;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;

import com.example.androidviewmodel.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private MyViewModel viewModel;
public final static String KEY_NAME = "Number";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setData(viewModel);
binding.setLifecycleOwner(this);
}

@Override
protected void onPause() {
super.onPause();
viewModel.save();
}
}