Android:SharedPreference实例详解

  • 2016年12月8日,Google中国开发者大会在京举行,同时正式上线了Google中国开发者网站Google Developers,查看官方学习资源再也不用爬梯子了

在Android系统中,常用的数据储存方式有四种:

  1. 存储在手机内存中ROM
  2. 存储在SD卡中
  3. 存储在SharedPreferences中
  4. 存储在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();
    }
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,142评论 25 707
  • 面试题总结 通用 安卓学习途径, 寻找资料学习的博客网站 AndroidStudio使用, 插件使用 安卓和苹果的...
    JingBeibei阅读 1,636评论 2 21
  • 曾经有段时间喜欢瑜伽,甚至有些走火入魔。那时候买了张会员卡,几乎每星期都会去练几次,每㳄练完人都觉得非常轻松。 原...
    RainbowPeng阅读 1,309评论 14 46
  • 考察團合影 【澳門日報消息】由澳門南安同鄉會、商會組織的“閩澳一家親 情系海絲源”澳門南安青年福建尋根探源考察團,...
    芯慧眼创业导师黄新辉阅读 279评论 0 0