您的位置:首页 > 移动开发 > Android开发

Android入门--SharedPreferences使用总结

2015-04-26 19:42 363 查看
Sharedperferences数据存储是Android系统的一种数据存储方式,这里简单介绍下Android系统的数据存储方式,Android系统提供了4中数据存储方式:

Sharedperferences :该存储方式适用于简单的数据保存,如配置属性,保存用户名等具有配置性质的数据存储,保存的数据是xml格式文件,通过键值对来获取和存储数据,不适合数据量较大的保存方式;

文件存储(File):文件存储方式是较常见的保存数据的方式,可以保存较大的数据,而且文件存储既能把数据保存在系统内存中,也能保存在SD卡中

数据库存储(SQLite): Android系统提供的SQLite轻量级数据库,完全支持SQL语句,数据库存储也能保存较大数据,可以保存在系统内存或者SD卡中,数据库存储可以保存具有一定规范的数据,非常高效,但是相应的需要数据库操作规范,相对前两者较复杂

网络存储(NetWork):通过网络将数据存储在服务器端,需要网络编程相关技能,一般适用于从服务器获取数据或者将本地用户信息上传到服务器端

接下来详细说明Sharedperferences的一些使用方法:

如前面介绍所说,Sharedperferences主要用于保存一些配置属性和保存用户名密码用于自动登录,其保存的数据是xml格式文件,文件路径为:/data/data/package name/shared_prefs

获取SharedPreferences的两种方式:

1 调用Context对象的getSharedPreferences()方法

2 调用Activity对象的getPreferences()方法

两种方式的区别:

调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享.

调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用.

需要注意的是,Sharedperferences中数据的获取一般是在Activity中的onCreate()方法中,因为一般是在程序初始化的时候调用配置信息或者用户名和密码。

SharedPreferences的四种操作模式:

Context.MODE_PRIVATE : 值为 0

Context.MODE_APPEND : 值为 32768

Context.MODE_WORLD_READABLE : 值为 1

Context.MODE_WORLD_WRITEABLE : 值为 2

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.

MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.

下面总结Sharedperferences的使用流程:

获取Sharedperferences对象,如上所述的两种方式获取Sharedperferences对象,根据具体的情况使用,这里假设使用第一中方式获取,使用getSharedPreferences(String name,int mode);第一个参数是要获取的文件名称(不带后缀),第二个参数是操作模式,可以写名称常量,也可以直接写常量对应的值。

读取数据。调用getString(String key,String defValue)等方法获取键值对的内容,第二个参数是在没有找到对应的第一个参数的值时返回的值,即缺省值。

保存数据:创建Editor类的对象用于获取SharedPreferences对象的edit()方法,然后调用putString(String key,String value)方法存放数据,最后要记得执行Editor类的对象的commit()方法提交对数据的修改,否则修改是无效的

以上,Sharedperferences的相关概念和使用方法都总结了,接下来是实例代码:

main.xml是布局文件,这里的布局是一个简单的登录界面

[code]<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/user"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="用户名:"
        android:textSize="25sp" />

    <TextView
        android:id="@+id/pwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/user"
        android:layout_marginTop="5dp"
        android:text="密    码:"
        android:textSize="25sp" />

    <EditText
        android:id="@+id/editUser"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/user" />

    <EditText
        android:id="@+id/editPwd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/editUser"
        android:layout_toRightOf="@id/pwd" />

    <CheckBox
        android:id="@+id/check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/pwd"
        android:layout_marginTop="19dp" />

    <Button
        android:id="@+id/Login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/check"
        android:layout_marginRight="26dp"
        android:layout_marginTop="15dp"

        android:onClick="doClick"
        android:text="登陆" />

    <TextView
        android:id="@+id/i_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@id/check"
        android:layout_alignBottom="@id/check"
        android:layout_marginLeft="18dp"
        android:layout_toRightOf="@id/check"
        android:text="是否选中"
        android:textSize="20sp" />

    <Button
        android:id="@+id/unpass"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@id/Login"
        android:layout_alignBottom="@id/Login"
        android:layout_alignParentRight="true"
        android:layout_marginRight="28dp"
        android:text="取消" />

</RelativeLayout>


SharedPreferencesActivity.java 主要逻辑结构在这里

[code]package hlju.edu.SharedPreferences;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class SharedPreferencesActivity extends Activity {
    private EditText editUser, editPwd;
    private CheckBox check;
    private SharedPreferences sharePre;
    private Editor editor;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 初始化控件
        editUser = (EditText) findViewById(R.id.editUser);
        editPwd = (EditText) findViewById(R.id.editPwd);
        check=(CheckBox) findViewById(R.id.check);

        // 获取sharedPreferences实例,创建main.xml文件用于保存数据
        // 文件路径为data/data/hlju.edu.SharedPreferences/shared_prefs/main.xml
        // 操作模式是默认模式
        sharePre = getSharedPreferences("main", MODE_PRIVATE);

        // 获取sharedPreferences实例的编辑类对象,用于对数据的修改
        editor = sharePre.edit();

        // 读取main.xml文件中 键 为“userName”的数据值,缺省值为“”
        // 注:这里的缺省值为“” 而非为null,所以下面的判断条件不能为if(nameString==null)
        String nameString = sharePre.getString("uesrName", "");
        if (nameString == "") {
            // 如果度读取到的userName 的值为 “”,就将控件check设置为“没有选中”状态
            check.setChecked(false);
        } else {
            // 如果读取到了userName 的值的不为“”,就将check设置为“选中”状态,并在编辑框中显示出值
            check.setChecked(true);
            editUser.setText(nameString);
        }
    }

    // 按钮的点击事件
    public void doClick(View v) {
        switch (v.getId()) {

        // 如果点击的是登录按钮
        case R.id.Login:
            // 就获取到输入的用户名和密码,分别赋值给nameString 和 pwdString
            String nameString = editUser.getText().toString().trim();
            String pwdString = editPwd.getText().toString().trim();

            // 如果用户名和密码都输入正确
            if ("admin".equals(nameString) && "123456".equals(pwdString)) {

                // 如果check是“选中”状态
                if (check.isChecked()) {
                    // 就存入一个键值对 键是 “userName” 值是 nameString
                    editor.putString("uesrName", nameString);
                    // 这里存储完成要记得调用其commit方法,用于提交
                    editor.commit();
                } else {
                    // 如果check是“没有选中”状态,就将键值对 “userName”移除
                    editor.remove("uesrName");
                    editor.commit();
                }

                Toast.makeText(SharedPreferencesActivity.this, "登陆成功",
                        Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(SharedPreferencesActivity.this, "登陆失败",
                        Toast.LENGTH_LONG).show();
            }
            break;

        default:
            break;
        }
    }

}


。。。就不上图了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: