从零开始学android<数据存储(1)SharedPreferences属性文件.三十五.>

在android中有五种保存数据的方法,分别是:

Shared Preferences
Store private primitive data in key-value pairs.
对应属性的键值对属性文件存储
Internal Storage
Store private data on the device memory.
设备内存存储
External Storage
Store public data on the shared external storage.
外部存储器存储,如内存卡
SQLite Databases
Store structured data in a private database.
sqlite数据库存储
Network Connection

Store data on the web with your own network server.网络存储



今天这一节我们一起来学习Shared
Preferences 属性文件存储的方式来存储简单的数据

我们可以使用Shared
Preferences 来存储 booleans, floats, ints, longs, and strings型的简单数据并以键值对的形式保存为xml文件。

为了实例化Shared
Preferences 我们可以使用

getSharedPreferences()和getPreferences() 这两个方法

第一个方法需要传入一个文件名和存储的模式

第二种方法默认为只有一个属性文件,只需要传入一个存储模式就行了

存储模式 :

MODE_PRIVATE仅本应用可用

MODE_APPEND可追加

MODE_WORLD_READABLE,可被其他应用读

MODE_WORLD_WRITEABLE.可被其他应用写

具体操作见代码注释

xml文件

<RelativeLayout 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: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=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="89dp"
        android:text="存储信息" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/button1"
        android:layout_below="@+id/button1"
        android:layout_marginTop="36dp"
        android:text="读取信息" />

</RelativeLayout>

JAVA文件

package com.example.sharedpreferences;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	private SharedPreferences sharedPreferences;
	private Button saveData, getDate;
	public static final String FILENAME = "flyou";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		sharedPreferences = getSharedPreferences(FILENAME, MODE_PRIVATE);
		saveData = (Button) this.findViewById(R.id.button1);
		getDate = (Button) this.findViewById(R.id.button2);
		saveData.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				SharedPreferences.Editor editor = sharedPreferences.edit();
				editor.putString("username", "jay");
				editor.putString("password", "553274238");
				Boolean flag = editor.commit();
				Toast.makeText(MainActivity.this, "执行完成,执行结果:-->" + flag, 2)
						.show();
			}
		});
		getDate.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String username = sharedPreferences.getString("username",
						"未找到匹配信息");
				String password = sharedPreferences.getString("password",
						"未找到用户密码");
				Toast.makeText(MainActivity.this,
						"用户名:——>" + username + ",密码:——>" + password, 2).show();
			}
		});
	}
}

接下来使用改方法来实现本地记住账号和密码的功能

里面可能会涉及到一些没有讲到的知识,大家可以先了解下,也对前面学过的其他组件进行一下回顾

xml文件

主界面

<RelativeLayout 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: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=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="19dp"
        android:layout_marginTop="42dp"
        android:text="用户名" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="58dp"
        android:text="密    码" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView1"
        android:layout_alignBottom="@+id/textView1"
        android:layout_marginLeft="40dp"
        android:layout_toRightOf="@+id/textView1"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView2"
        android:layout_alignBottom="@+id/textView2"
        android:layout_alignLeft="@+id/editText1"
        android:ems="10"
        android:inputType="textPassword" />

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button1"
        android:layout_alignRight="@+id/editText2"
        android:text="记住密码" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_alignParentLeft="true"
        android:text="注册账号" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/checkBox1"
        android:text="登录" />

</RelativeLayout>

登录后界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

JAVA文件

package com.example.sharepreferencesdemo;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;

public class MainActivity extends Activity {
	private SharedPreferences sharedPreferences;
	private Button login;
	private CheckBox checkBox;
	private EditText username, password;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		login = (Button) this.findViewById(R.id.button1);
		checkBox = (CheckBox) this.findViewById(R.id.checkBox1);
		username = (EditText) this.findViewById(R.id.editText1);
		password = (EditText) this.findViewById(R.id.editText2);
		sharedPreferences = getPreferences(MODE_PRIVATE);// 通过getPreferences实例化sharedPreferences对象

		String usernameString = sharedPreferences.getString("username", "");// 读取用户名
		username.setText(usernameString);// 为编辑框设置内容

		// 获取复选框的选中状态,如果选中的话就 进行记住密码的操作
		if (sharedPreferences.getBoolean("checked", false)) {
			// 获取密码
			String passwordString = sharedPreferences.getString("password", "");
			// 设置编辑框信息
			password.setText(passwordString);
		}

		login.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 通过edit 方法实例化Editor对象,储存信息
				SharedPreferences.Editor editor = sharedPreferences.edit();
				// 以键值对的形式储存信息
				editor.putString("username", username.getText().toString());
				editor.putString("password", password.getText().toString());
				// 判断复选框的选中状态并进行存储
				if (checkBox.isChecked()) {
					editor.putBoolean("checked", true);
				} else {
					editor.putBoolean("checked", false);
				}
				// 执行储存操作
				editor.commit();

				// 设置进度对话框
				final ProgressDialog dialog = new ProgressDialog(
						MainActivity.this);
				// 设置标题
				dialog.setTitle("用户登录");
				// 设置提示信息
				dialog.setMessage("正在登录,请稍后……");
				// 开始进度对话框
				dialog.onStart();
				// 延时线程操作
				new Thread() {

					@Override
					public void run() {
						// TODO Auto-generated method stub
						try {
							// 休眠3秒
							Thread.sleep(3 * 1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						} finally {
							// 对话框消失
							dialog.dismiss();
							// 设置意图转跳
							Intent intent = new Intent(MainActivity.this,
									main.class);

							// 传递意图信息
							intent.putExtra("username", username.getText()
									.toString());
							// 开始activity转跳
							startActivity(intent);
							MainActivity.this.finish();
						}
					}
				}.start();// 开始线程操作
				// 显示对话框
				dialog.show();

			}
		});

	}
}

登陆后的界面

package com.example.sharepreferencesdemo;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.TextView;

public class main extends Activity {
	private TextView text;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.linearlayout);
		text=(TextView)this.findViewById(R.id.textView3);
		Intent intent=getIntent();
		text.setTextSize(15);
		text.setGravity(Gravity.CENTER_HORIZONTAL);
		text.setTextColor(Color.CYAN);
		text.setText("欢迎: "+intent.getStringExtra("username"));
	}
}

未点击记住密码,第二次登录。

点击记住密码登录

点击记住密码后,第三次登录

介绍了SharedPreferences属性文件的存储,我们可以进行较小数据的快速存储与便捷读取

下节预报:Internal
Storage内部存储器

时间: 2024-10-15 15:10:27

从零开始学android<数据存储(1)SharedPreferences属性文件.三十五.>的相关文章

从零开始学android&lt;android事件的处理方式.二十四.&gt;

在android中一共有 多种事件,每种事件都有自己相对应的处理机制 如以下几种 1 单击事件 View.OnClickListener public abstract void onClick (View v) 单击组件时触发 2 单击事件 View.OnLongClickListener public abstract boolean onLongClick (View v) 长按组件时触发 3 键盘事件 View.OnKeyListener public abstract boolean

二十四、Android文件的读写

Android的文件读写与JavaSE的文件读写相同,都是使用IO流.而且Android使用的正是JavaSE的IO流,下面我们通过一个练习来学习Android的文件读写. 1.创建一个Android工程 [html] view plaincopy Project name:File BuildTarget:Android2.2 Application name:文件读写 Package name:test.file Create Activity:DateActivity Min SDK Ve

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

Android学习路线(二十四)ActionBar Fragment运用最佳实践

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述

Android 沉浸式状态栏 实现方式二 ( 更简单 )

以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 . 相关链接 http://www.apkbus.com/forum.php?mod=viewthread&tid=255929&extra=page%3D3%26filter%3Dsortid%26orderby%3Ddateline%26sortid%3D12 1.效果图 demo 的 github 地址  https://github.com/zyj1609wz/Android

Android笔记二十四.Android基于回调的事件处理机制

如果说事件监听机制是一种委托式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器完全消失了,当用户在GUI控件上激发某个事件时,控件自己特定的方法将会负责处理该事件. 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.View类的常见回调方法 为了使用回调机制来处理GUI控件上所发生的事件,需要为该组件提供对应的事件处理方法,而Java又是一种静态语言,我们无法为每个对象动态地添

Android开发系列(二十四):Notification的功能与用法

关于消息的提示有两种:一种是Toast,一种就是Notification.前者维持的时间比较短暂,后者维持的时间比较长. 而且我们平常手机的应用比如网易.贴吧等等都有很多的推送消息,就是用Notification实现的. Notification是显示在手机状态栏的通知-手机状态栏位于手机屏幕的上方.程序一般通过NotificationManager服务来发送Notification通知 Notification的一些方法,接下来我们都能够用到: setDefaults():设置通知LED等.音

Android学习笔记二十四.Service入门(二)绑定本地Service并与之通信

绑定本地Service并与之通信    通过上一篇博文的前3步,我们就算完成了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分).但当程序通过startService()和stopService()启动.关闭Service时,Service与访问者之间基本上不存在太多的关联,因此Service和访问者之间也无法进行通信.数据交换.如果我们希望开发的Service能与访问者之间实现方法调用或数据交换,我们可以让访问者使用bindService()和unbin

Android开发系列(二十四):Notification的功能与使用方法

关于消息的提示有两种:一种是Toast,一种就是Notification.前者维持的时间比較短暂,后者维持的时间比較长. 并且我们寻常手机的应用比方网易.贴吧等等都有非常多的推送消息.就是用Notification实现的. Notification是显示在手机状态栏的通知-手机状态栏位于手机屏幕的上方.程序一般通过NotificationManager服务来发送Notification通知 Notification的一些方法.接下来我们都可以用到: setDefaults():设置通知LED等.

《Android源码设计模式解析与实战》读书笔记(二十四)

第二十四章.桥接模式 桥接模式也称为桥梁模式,是结构型设计模式之一.桥接模式中体现了"单一职责原则"."开闭原则"."里氏替换原则"."依赖倒置原则"等.同时它也是很实用的一种模式. 1.定义 将抽象部分与现实部分分离,使它们都可以独立地进行变化. 2.使用场景 (1)如果一个系统需要在构建的抽象化角色和具体角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系. (2)对于那些不希望使用继承或因为多层次继承导致系统类