Android数据储存方案

Android数据常用的储存方案,分别如下

文件储存数据

将文件储存到文件中

Context类提供了一个openFileOutput()方法,可以用于将数据文件储存到指定的文件中。这个方法接收两个参数,第一个参数文件名,可以不包含路径,默认储存位置/data/data/<package-name>/files/目录下,第二个参数是文件的操作模式,MODE_PRIVATEMODE_APPEND,其中MODE_PRIVATE是默认的操作模式,表示同名文件时覆盖原文件,后者则表示追加

OpenFileOuput()方法返回的是一个FileOutputStream对象,得到这个对象就可以使用Java流的方式将文件写入到文件中了

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void save(String inputText) {
FileOutputStream out;
BufferedWriter writer = null;
try {
// 得到一个FileOutputStream对象
out = openFileOutput("data", Context.MODE_PRIVATE);
// 构建出一个OutputStreamWriter对象
// 再使用OutputStreamWriter构建出一个BufferedWriter对象
writer = new BufferedWriter(new OutputStreamWriter(out));
// 使用BufferedWriter来将文本内容写入到文件中
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

修改MainActivity中的代码,布局加入EditText,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainActivity extends AppCompatActivity {

private EditText edit;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = findViewById(R.id.edit);
}

@Override
protected void onDestroy() {
super.onDestroy();
// 重写onDestroy(),保证销毁前一定会调用这个方法
String inputText = edit.getText().toString();
save(inputText);
}
//...save()
}

从文件中读取数据

类似的,Context类提供一个openFileInput()方法,用于从文件中读取数据。它只接收一个参数,即要读取的文件文件名,然后系统会自动到/data/data/<package-name>/files/中去加载这个文件,并返回一个FileInputStream对象,得到这个对象再通过Java流的方式就可以将数据读取出来了。

示例

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
private String load() {
FileInputStream in;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();

try {
// 得到一个FileInputStream对象
in = openFileInput("data");
// 使用InputStreamReader构建出一个BufferedReader对象
reader = new BufferedReader(new InputStreamReader(in));
String line;// 使用BufferedReader 逐行读取,把文件中所有的文本内容全部读取出来存放到StringBuilder中
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}

修改MainActivity实现EditText能够保存上次输入的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainActivity extends AppCompatActivity {

private EditText edit;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String inputText = load();
edit = findViewById(R.id.edit);
if (!TextUtils.isEmpty(inputText)) {
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring successed", Toast.LENGTH_SHORT).show();
}
}
//...
//...save()
//...load()
}

使用SharePreferences储存数据

将数据储存到SharedPreferences中

SharePreferences是用键值对的方式来储存数据的。每当保存一条数据,需要给这条数据提供相应的键,这样在读取文件的时候就可以通过这个键把相应的值取出来。而且SharePreferences还支持多种不同的数据类型的储存

Android提供了三种得到SharePreferences的方法

  1. Context类中的getSharePreferences()方法
    此方法接收两个参数,第一个用于指定SharePreferences文件的名称,如果指定的文件不存在则会创建一个,SharePreferences文件都是放在/data/data/<package-name>/shared_prefs/目录下的。第二个参数用于指定操作模式,主要有两种模式可以选择,MODE_PRIVATEMODE_MULTI_PROCESS,MODE_PRIVATE仍然是默认的操作模式,表示当前的应用程序才会对SharePreferences文件进行读写。MODE_MULTI_PROCESS则一般用于会有多个进程中对同一个文件进行读写的情况
  2. Activity类中的getPreferences()方法
    这个方法和Context中的getSharePreferences()方法类似,不过它只接收一个操作模式的参数,因为使用这个方法时会自动将当前活动的类名作为SharePreferences的文件名
  3. PreferenceManeger类中的getDefaultSharePreferences方法
    这是一个静态方法,它接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharePreferences文件,操作可分为三步
    1. 调用SharePreferences对象的edit()方法来获取一个SharePreferences.Edit对象。
    2. SharePreferences.Edit对象中添加数据,比如添加一个布尔型数据就使用putBoolean方法,以此类推
    3. 调用apply()方法将添加的数据提交,从而完成数据储存的操作

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MainActivity extends AppCompatActivity {

private Button btnSaveData;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnSaveData = findViewById(R.id.btnSaveData);
btnSaveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 通过getSharedPreferences()方法指定SharedPreferences的文件名为data,并得到SharedPreferences.Editor对象。
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
// 调用apply()方法进行提交
editor.apply();
}
});
}
}

从SharedPreferences中读取数据

//TODO 未完待续

SQLite数据库储存数据

坚持原创技术分享,您的支持将鼓励我继续创作!