- 2016年12月8日,Google中国开发者大会在京举行,同时正式上线了Google中国开发者网站Google Developers,查看官方学习资源再也不用爬梯子了
在Android系统中,常用的数据储存方式有四种:
- 存储在手机内存中ROM
- 存储在SD卡中
- 存储在SharedPreferences中
- 存储在SQLite数据库中
在这里只介绍Android特有的SP和SQLite
SharedPreferences
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置,它提供了Android平台常规的Long、Int、String字符串型的保存。
SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。
xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。
这种方式应该是用起来最简单的Android读写外部数据的方法了。他以一种简单、 透明的方式来保存一些用户个性化设置的字体、颜色、位置等参数信息。一般的应用程序都会提供“设置”或者“首选项”的这样的界面,那么这些设置最后就可以通过Preferences来保存,而程序员不需要知道它到底以什么形式保存的,保存在了什么地方。当然,如果你愿意保存其他的东西,也没有什么限制。只是在性能上不知道会有什么问题。
在Android系统中该文件保存在:/data/data/PACKAGE_NAME /shared_prefs 目录下。
下面是一个使用SP做数据存储模拟用户登录的案例:
布局文件:
<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"
tools:context=".MainActivity" >
<EditText
android:layout_marginTop="10dp"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:hint="请输入用户名"
android:id="@+id/et_username"
/>
<EditText
android:layout_marginTop="10dp"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:hint="请输入密码"
android:inputType="textPassword"
android:id="@+id/et_pwd"
/>
<LinearLayout
android:layout_marginTop="10dp"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal"
android:gravity="right"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登陆"
android:onClick="login"
/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存密码"
android:layout_marginRight="10dp"
android:id="@+id/cb"
/>
</LinearLayout>
</LinearLayout>
案例代码:
public class MainActivity extends Activity {
private EditText et_username;
private EditText et_pwd;
private CheckBox cb;
//声明一个SharedPreferences对象
private SharedPreferences sp;
/*
* 为了方便,因此将用户名和密码设置为常量
*/
private static final String PWD = "123456";
private static final String USERNAME = "wzy";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* 第二个参数代表的是创建该文件的访问范围(权限),通常并建议选择MODE_PRIVATE,该值为0,
* 意思是只有当前应用可以访问该文件。而还有2个可选项MODE_WORLD_READABLE 和MODE_WORLD_WRITEABLE
* 值分别为1和2已经废除,因为这两种方式可以允许其他应用来访问此文件,这是很不安全的。
*/
sp = getSharedPreferences("info", MODE_PRIVATE);
et_username = (EditText) findViewById(R.id.et_username);
et_pwd = (EditText) findViewById(R.id.et_pwd);
cb = (CheckBox) findViewById(R.id.cb);
/*
* 从sp中获取用户信息,用户数据的回显
* 第二个参数为默认返回值,也就是当要查找的key-value不存在时,返回的数据
*/
String username = sp.getString("username", "");
String pwd = sp.getString("pwd", "");
et_username.setText(username);
et_pwd.setText(pwd);
}
public void login(View view){
String userName = et_username.getText().toString();
String pwd = et_pwd.getText().toString();
boolean checked = cb.isChecked();
/*
* 用户名和密码如果为空,则提示用户。
*/
if (TextUtils.isEmpty(userName)) {
Toast.makeText(this, "用户名不能为空!", Toast.LENGTH_SHORT).show();
return ;
}
if (TextUtils.isEmpty(pwd)) {
Toast.makeText(this, "密码不能为空!", Toast.LENGTH_SHORT).show();
return ;
}
/*
* 如果用户选择了保存密码,则将用户名和密码保存在手机内存中
* 如果没有选择就将文件删除
*/
if (USERNAME.equals(userName)&&PWD.equals(pwd)) {
if (checked) {
/*
* 在对sp进行写、修改需要获取Editor对象
*/
Editor editor = sp.edit();
editor.putString("username", userName);
editor.putString("pwd", pwd);
/*
* 此处非常重要,执行完修改或者写操作后只有调用sp的commit方法,数据才会被保存下来。
*/
editor.commit();
}else {//删除用户文件
Editor editor = sp.edit();
/*
* 删除该sp中的所有数据
*/
editor.clear();
editor.commit();
}
Toast.makeText(this, "恭喜您,登陆成功!", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "对不起,登陆失败!", Toast.LENGTH_SHORT).show();
}
}
}
网友评论