Android下的数据存储与访问方式(一)

很多时候我们的软件需要对处理后的数据进行存储或再次访问。
Android为数据存储提供了如下几种方式:

  • 文件
  • SharedPreferences
  • SQLite
  • 网络
  • ContentProvider

转载请注明出处:http://shenshanlaoyuan.com/2016/05/13/Android/Android下的数据存储与访问方式(一)/

访问原文「Android下的数据存储与访问方式(一)」获取最佳阅读体验并参与讨论

文件的方式

将数据文件保存到应用程序中

用模拟QQ登录保存帐号和密码做个简单的例子

简单的写了下QQ登录界面布局,如下:

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
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.shenshanlaoyuan.qqlogin.MainActivity" >
<ImageView
android:layout_gravity="center"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/qq"/>
<EditText
android:id="@+id/qqnumber"
android:hint="QQ号/手机号/邮箱"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/qqpassword"
android:hint="密码"
android:inputType="textPassword"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<CheckBox
android:id="@+id/remember"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="记住用户名和密码" />
<Button
android:onClick="login"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="登录"
android:background="#03a9f4"/>
</LinearLayout>

点击登录按钮就会把帐号和密码保存到应用程序的file文件夹下,代码实现

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public class MainActivity extends ActionBarActivity {
private EditText ed_qqnumber;
private EditText ed_qqpassword;
private CheckBox cbx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//初始化控件
ed_qqnumber = (EditText) findViewById(R.id.qqnumber);
ed_qqpassword = (EditText) findViewById(R.id.qqpassword);
cbx = (CheckBox) findViewById(R.id.remember);
//回显数据
File file = new File(this.getFilesDir(),"info.txt");
//判断文件是否存在且有内容
if(file.exists() && file.length()>0){
try {
//读取文件数据,然后回显
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String readLine = bufferedReader.readLine();
String number = readLine.split("##")[0];
String password = readLine.split("##")[1];
ed_qqnumber.setText(number);
ed_qqpassword.setText(password);
} catch (Exception e) {
// TODO: handle exception
}
}
}
//点击登录后会执行login 方法
public void login (View v){
//获取输入框中写入者值
String number = ed_qqnumber.getText().toString().trim();
String password = ed_qqpassword.getText().toString().trim();
// 判断是否填入了number以及 password的值
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(password)){
//给用户提示, 输入账号和密码
Toast.makeText(this, "账号和密码不能为空", 0).show();
return;
}
//判断是否勾选了checkbox ,如果勾选了checkbox ,那么就将 qq号和密码保存起来
boolean isChecked = cbx.isChecked();
if(isChecked){
//在勾选了checkbox的时候, 将数据保存起来
try {
File file = new File(this.getFilesDir(), "info.txt");
OutputStream outputStream = new FileOutputStream(file);
String value = number + "##" + password;
outputStream.write(value.getBytes());
outputStream.close();
Toast.makeText(this, "保存成功", 0).show();
} catch (Exception e) {
// TODO: handle exception
Toast.makeText(this, "保存失败", 0).show();
}
}
}
}

保存成功就会在file文件夹下产生保存了帐号密码的文件,如下图

有时候一些临时数据需要保存起来,只需要把new File(this.getFilesDir(),"info.txt")改成new File(this.getCacheDir(),"info.txt"),文件就会保存到cache文件夹下,也就是应用程序的缓存目录。

保存数据文件到SD卡中

保存数据到sd 卡中需要申请权限

sdcard 做为一个外部的存储设备,有时候sdcard是处于弹出状态,未插入状态, 强制拔出状态. 那么在这些情况下,如果 要向sdcard 中写数据, 为了保证数据确切的存储, 提高用户的感受, 所以在存储到sd 卡中之前, 会去动态判断 sdcard 的状态,只有在sdcard 是处于挂载的状态下,再去 写 sd 卡数据

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
46
47
48
49
50
51
if(isChecked){
//在勾选了checkbox的时候, 将数据保存起来
try {
//细节 一 :
// 判断sdcar的 状态
String status = Environment.getExternalStorageState();
// 这里status动态的返回的 sd 卡的状态
// 如果是mouted --- 挂载 , 那么这个时候 可以去 写 数据到 sd 卡中
if(!Environment.MEDIA_MOUNTED.equals(status)){
// 表示sd 卡未挂载, 那么 这个时候 就提示用户 检查sd 卡的状态
Toast.makeText(this, "请检查 sd 卡的状态 ", 0).show();
return;
}
// 细节二 :
// 返回可用的 空闲的 空间 大小 ---- in bytes
long freeSpace = Environment.getExternalStorageDirectory().getFreeSpace();
//拿到 sd 卡的总的大小, in bytes
Environment.getExternalStorageDirectory().getTotalSpace();
//拿到 sd 卡 已经使用的 的大小, in bytes
Environment.getExternalStorageDirectory().getUsableSpace();
// 调用这个api 去获得sd卡的可用 控件,这里还做了一个事, 将返回的字节 空间 做了单位的
// 转换
String avalableSize = Formatter.formatFileSize(this, freeSpace);
Toast.makeText(this,"可用的 空间 是 : "+ avalableSize, 0).show();
File file = new File(Environment.getExternalStorageDirectory(),"info.txt");
OutputStream out = new FileOutputStream(file);
String value = number+"##"+password;
out.write(value.getBytes());
out.close();
Toast.makeText(this, "保存成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "保存失败", 0).show();
}
}
深山老猿 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
如对你有帮助,请我喝杯咖啡吧!
显示 Gitment 评论