安卓保存数据的三种方式--Rom、SD、sharepreference

来源:互联网 发布:yaw 算法 编辑:程序博客网 时间:2024/06/05 05:15

下面我将讲一下初学者应该掌握的安卓保存数据的三种方式

要求:做一个登录的界面,用户可以输入账号和密码,有确定的按钮,有一个记住密码的勾选框,若用户在选择记住密码后,下次登录时账号密码仍然存在,不需要用户再次输入。界面如下
 
恩,布局十分的简单,我就不废话了,直接贴出代码,来看下activity_main.xml的实现
<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" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/user" />    <EditText        android:id="@+id/ed_user"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:hint="请输入你的账号"        android:inputType="text" />    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/password" />    <EditText        android:id="@+id/ed_password"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:hint="请输入你的密码"        android:inputType="textPassword" />    <RelativeLayout        android:layout_width="fill_parent"        android:layout_height="wrap_content" >        <CheckBox            android:id="@+id/cb"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@string/remember_password" />        <Button            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignParentRight="true"            android:onClick="login"            android:text="@string/yes" />    </RelativeLayout>    <RadioGroup        android:id="@+id/rd_findlocation"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <RadioButton            android:id="@+id/rd_rom"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:checked="true"            android:text="@string/rom" />        <RadioButton            android:id="@+id/rd_sd"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@string/sd" />                <RadioButton            android:id="@+id/rd_sp"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@string/sp" />    </RadioGroup></LinearLayout>

布局截图


1:ROM

那么先来讲一下数据是如何存入ROM中
自定义一个方法SaveToRom
<pre name="code" class="java">/** * 保存数据到手机的Rom中 * @param context 上下文 * @param user用户名 * @param password密码 * @throws Exception */public static void SaveToRom(Context context, String user, String password) throws Exception {/** * context.getFilesDir(),通过上下文直接获取该app的路径,第二个参数为指定的txt名 */File file = new File(context.getFilesDir(), "login.txt");FileOutputStream fos = new FileOutputStream(file);//输出流String txt = user+":"+password;fos.write(txt.getBytes());//往login.txt中写入内容,要以字节的方式fos.flush();//清空缓存fos.close();//关闭该过程}


由上可见,通过读取用户输入的账号和密码,然后将其写入我们已经建立好的txt中
既然有存入的方法,自然有读取的方法ReadFromRom
<span style="white-space:pre"></span>/** * 从Rom中读取用户的账号和密码 * @param context * @throws Exception */public static String ReadFromRom(Context context) throws Exception{File file=new File(context.getFilesDir(),"login.txt");FileInputStream fis=new FileInputStream(file);//输入流String result=readFromStream(fis);    return result;}

经过测试后,我们可以在自己虚拟机的目录\data\data\com.example.login\files\login.txt
将其导出后查看刚才输入的账号和密码

2:SD

将数据存入SD卡的方法与ROM相似,不过修改SD卡中的内容需要加入权限
/** * 保存数据到SD卡 * @param user 用户名 * @param password密码 * @throws Exception */public static void  SaveToSd(String user,String password)throws Exception{File file=new File(Environment.getExternalStorageDirectory(), "login.txt");//第一个参数用来获取外部存贮器sd卡的路径FileOutputStream fos = new FileOutputStream(file);//输出流String txt = user+":"+password;fos.write(txt.getBytes());//往login.txt中写入内容,要以字节的方式fos.flush();//清空缓存fos.close();//关闭该过程}

权限语句
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

可以通过虚拟机的目录下\sdcard\login.txt查看刚才输入的账号和密码



3:SharePreference 

sharepreference存储数据的方式更加简单粗暴,相对于前面两种方法,它更具有优势

写入数据
<span style="white-space:pre"></span>/** * 保存应用程序数据 到sharedpreference * @param context 上下文 * @param name 姓名 * @param password 密码 */public static void saveTOSP (Context context, String user, String password){//获取系统的一个sharedpreference文件  名字叫 sp@SuppressWarnings("deprecation")SharedPreferences sp=context.getSharedPreferences("sp", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);//SharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE<span style="white-space:pre"></span>);//创建一个编辑器 可以编辑 spEditor editor = sp.edit();editor.putString("user", user);editor.putString("password", password);editor.putBoolean("boolean", false);editor.putInt("int", 8888);editor.putFloat("float",3.14159f);//注意:调用 commit 提交 数据到文件.editor.commit();//editor.clear();}

读取数据
<span style="white-space:pre"></span>/** * 获取系统sharepreference里面的数据 * @param context * @return */public static Map<String,String> readFromSP(Context context){Map<String,String> map = new HashMap<String, String>();SharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_PRIVATE);String user = sp.getString("user", "defaultname");String password = sp.getString("password", "password");map.put("user", user);map.put("password", password);return map;}


可以将虚拟机下的\data\data\com.example.login\shared_prefs\login.xml导出查看

SaveService.java
package com.example.login;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.HashMap;import java.util.Map;import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.os.Environment;public class SaveService {/** * 保存数据到手机的Rom中 * @param context 上下文 * @param user用户名 * @param password密码 * @throws Exception */public static void SaveToRom(Context context, String user, String password) throws Exception {/** * context.getFilesDir(),通过上下文直接获取该app的路径,第二个参数为指定的txt名 */File file = new File(context.getFilesDir(), "login.txt");FileOutputStream fos = new FileOutputStream(file);//输出流String txt = user+":"+password;fos.write(txt.getBytes());//往login.txt中写入内容,要以字节的方式fos.flush();//清空缓存fos.close();//关闭该过程}/** * 从Rom中读取用户的账号和密码 * @param context * @throws Exception */public static String ReadFromRom(Context context) throws Exception{File file=new File(context.getFilesDir(),"login.txt");FileInputStream fis=new FileInputStream(file);//输入流String result=readFromStream(fis);    return result;}/** * 保存数据到SD卡 * @param user 用户名 * @param password密码 * @throws Exception */public static void  SaveToSd(String user,String password)throws Exception{File file=new File(Environment.getExternalStorageDirectory(), "login.txt");//第一个参数用来获取外部存贮器sd卡的路径FileOutputStream fos = new FileOutputStream(file);//输出流String txt = user+":"+password;fos.write(txt.getBytes());//往login.txt中写入内容,要以字节的方式fos.flush();//清空缓存fos.close();//关闭该过程}private static String readFromStream(FileInputStream fis)throws Exception {ByteArrayOutputStream baos=new ByteArrayOutputStream();//捕获内存中的数据,将其转换成字节byte[] buffer=new byte[1024];//定义一个字节型数组int len=0;//循环控制变量while((len=fis.read(buffer))!=-1){//只要不是最后一个字符就不断循环/** * 第一个参数为我们需要写入的数据 * 第二个参数为数据从数组哪个位置开始写入 * 第三个参数为数组的长度 */baos.write(buffer, 0, len);}fis.close();String result=baos.toString();//将字节数据转换为字符型数据baos.close();return result;}/** * 保存应用程序数据 到sharedpreference * @param context 上下文 * @param name 姓名 * @param password 密码 */public static void saveTOSP (Context context, String user, String password){//获取系统的一个sharedpreference文件  名字叫 sp@SuppressWarnings("deprecation")SharedPreferences sp=context.getSharedPreferences("sp", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);//SharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);//创建一个编辑器 可以编辑 spEditor editor = sp.edit();editor.putString("user", user);editor.putString("password", password);editor.putBoolean("boolean", false);editor.putInt("int", 8888);editor.putFloat("float",3.14159f);//注意:调用 commit 提交 数据到文件.editor.commit();//editor.clear();}/** * 获取系统sharepreference里面的数据 * @param context * @return */public static Map<String,String> readFromSP(Context context){Map<String,String> map = new HashMap<String, String>();SharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_PRIVATE);String user = sp.getString("user", "defaultname");String password = sp.getString("password", "password");map.put("user", user);map.put("password", password);return map;}}

MainActivity.java
package com.example.login;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.text.TextUtils;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.RadioGroup;import android.widget.Toast;public class MainActivity extends Activity {private EditText ed_user;private EditText ed_password;private CheckBox cb;private RadioGroup rd_findlocation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ed_user = (EditText) findViewById(R.id.ed_user);ed_password = (EditText) findViewById(R.id.ed_password);cb = (CheckBox) findViewById(R.id.cb);rd_findlocation = (RadioGroup) findViewById(R.id.rd_findlocation);// 检测rom文件中是否有密码信息//try {//String result = SaveService.ReadFromRom(this);// 获取信息//String[] infos = result.split(":");// split方法用来切割数据,参数为分割符//ed_user.setText(infos[0]);//ed_password.setText(infos[1]);//} catch (Exception e) {//// TODO Auto-generated catch block//e.printStackTrace();//}// 获取sp里面的数据Map<String, String> map = SaveService.readFromSP(this);ed_user.setText(map.get("user"));ed_password.setText(map.get("password"));}public void login(View view) {String user = ed_user.getText().toString().trim();// 获取账号,去除空格String password = ed_password.getText().toString().trim();// 获取密码,去除空格if (TextUtils.isEmpty(user) || TextUtils.isEmpty(password)) {// 判断账号密码是否为空Toast.makeText(getApplicationContext(), R.string.isempty,Toast.LENGTH_SHORT).show();return;}if (cb.isChecked()) {int radioButtonId = rd_findlocation.getCheckedRadioButtonId();// 获取用户所选取的IDswitch (radioButtonId) {case R.id.rd_rom:try {SaveService.SaveToRom(this, user, password);Toast.makeText(getApplicationContext(), "成功保存rom密码",Toast.LENGTH_SHORT).show();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();Toast.makeText(this, "保存rom用户名密码失败", Toast.LENGTH_LONG).show();}break;case R.id.rd_sd:/** * MEDIA_MOUNTED :sd卡在的状态 * Environment.getExternalStorageState():判断sd卡的状态 */if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {try {SaveService.SaveToSd(user, password);Toast.makeText(this, "成功保存sd用户名密码", Toast.LENGTH_LONG).show();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();Toast.makeText(this, "保存sd用户名密码 失败", Toast.LENGTH_LONG).show();}} else {Toast.makeText(this, "sd卡不可用 ,请检查sd卡状态", Toast.LENGTH_LONG).show();}break;case R.id.rd_sp:SaveService.saveTOSP(this, user, password);Toast.makeText(this, "保存到sp完成", 0).show();break;}} else {Toast.makeText(getApplicationContext(), "不需要记住密码",Toast.LENGTH_SHORT).show();}}}


----------------------------晴天_1993----------------------------




0 0