数据保存(Rom,SdCard)

本文详细介绍了如何在Android应用中实现用户数据的内部存储(ROM)和外部存储(SDCard),包括数据保存、读取及删除操作。通过设置CheckBox控制是否保存密码,实现了用户在后续登录时的便捷体验。

内部存储Rom,外部存储SdCard,数据的保存。当“记住密码”的状态为选择的时候,第二次进入界面直接显示已经保存好的用户名和密码,如下图所示:



在布局文件中写好界面的显示,然后根据控件的id开始进行数据保存的判断和设置。

在initView方法中找到控件,并将控件对象设置为全局变量:

package com.mzx.savedata;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.os.Bundle;
import android.os.Environment;
import android.provider.ContactsContract.DeletedContacts;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

	private EditText et_username;
	private EditText et_password;
	private CheckBox cb_save;
	private Button bt_login;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initView();
		initData();
		initListener();
	}

	private void initView() {
		et_username = (EditText) this.findViewById(R.id.et_username);
		et_password = (EditText) this.findViewById(R.id.et_pasword);
		cb_save = (CheckBox) this.findViewById(R.id.cb_save);
		bt_login = (Button) this.findViewById(R.id.bt_login);
		
	}


在initListener方法中,设置登录的点击按钮的监听事件,获取用户名和密码对象转换为String类型,点击事件发生后判断用户名和密码是否为空,为空时弹出提示,不为空时继续执行下面的操作。代码如下所示:

private void initListener() {
		bt_login.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				String username=et_username.getText().toString().trim();
				String password=et_password.getText().toString().trim();
				if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
					Toast.makeText(MainActivity.this, "用户名或密码不能为空!", Toast.LENGTH_SHORT).show();
					return;
				}
				if(cb_save.isChecked()){
					//savaToRom(username, password);
					saveToSDCard(username, password);
					
				}else{
					delete(null);
					
				}
				
				
				Toast.makeText(MainActivity.this, "直接登录", Toast.LENGTH_SHORT).show();
			}
		});
		
	}



当用户名和密码不为空的时候,并且选择了记住密码的状态,则写入一个方法savaToRom(username, password);

设置FileOutputStream,写入对象,("config.txt", Context.MODE_PRIVATE):创建一个txt文件,mode设置为私有,将用户名和密码存入Config.txt文件中

用分号“:”将用户名和密码分割,存入流中,然后进行刷流,关流,保存成功则提示,文件没有创建时也进行提示。

代码如下所示:

private void savaToRom(String username, String password) {
		try {
			FileOutputStream fileOutput = MainActivity.this.openFileOutput("config.txt", Context.MODE_PRIVATE);
			String saveStr=username+":"+password;
			fileOutput.write(saveStr.getBytes());
			fileOutput.flush();
			fileOutput.close();
			Toast.makeText(MainActivity.this, "密码保存成功,直接登录", Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Toast.makeText(MainActivity.this, "文件没有找到,直接登录", Toast.LENGTH_SHORT).show();
		}
	}

当第一次登陆保存数据时,第二次登陆直接显示用户名和密码,当把“记住密码”的状态删掉时,第三次登陆则不再显示用户名和密码,这个功能就是在判断记住密码状态为true的时候,再写一个else判断,在里面写入一个delete方法,不需要传参数,再在下面生成一个protecd的方法,写具体操作,就是将config.txt文件变为一个空文件:

protected void delete(Object object) {
		// TODO Auto-generated method stub
		try {
			FileOutputStream fileOutput = MainActivity.this.openFileOutput("config.txt", Context.MODE_PRIVATE);
			fileOutput.flush();
			fileOutput.close();
			} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

在initData方法中写读入数据的操作,这个操作可以将已经保存好的数据直接显示在登录界面,不用再次输入用户名和密码。

设置流FileInputStream,参数中写数据所保存的文件的名字,穿件一个byte数组,循环读这个文件中的数据,当数组的长度不为-1的时候,则不断的循环读取

将读入的数据保存,设置编码格式为utf-8,然后将数据用分号进行分割,记住关流。

设置对象的值,用户名为值就取下标为0时的数据,密码的值就取下标为1的数据,最后要记住将记住密码的状态设置为true。

private void initData() {
		try {
			FileInputStream fileInput = this.openFileInput("config.txt");
			byte[] buffer=new byte[1024];
			ByteArrayOutputStream baos=new ByteArrayOutputStream();
			int len=0;
			while((len=fileInput.read(buffer))!=-1){
				baos.write(buffer, 0, len);
				
			}
			byte[] array = baos.toByteArray();
			String configStr=new String(array, "utf-8");
			
			String[] strings=configStr.split(":");
			
			baos.close();
			fileInput.close();
			
			et_username.setText(strings[0]);
			et_password.setText(strings[1]);
			
			cb_save.setChecked(true);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		}
		
		
	}


上面所说的是内部存储ROM的数据保存方式,外部存储SDCard的方法如下:

protected void saveToSDCard(String username, String password) {
		// TODO Auto-generated method stub
		//判断SDCard是否存在
		if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
			Toast.makeText(MainActivity.this, "SDCard不可用!", Toast.LENGTH_SHORT).show();
		}
		File file=new File(Environment.getExternalStorageDirectory(), "config.txt");
		try {
			FileOutputStream fos=new FileOutputStream(file);
			String configStr=username +":"+ password;
			fos.write(configStr.getBytes());
			fos.flush();
			fos.close();
			Toast.makeText(MainActivity.this, "密码保存成功,直接登录", Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
先判断是否存在SDCard,不存在则弹出提示,存在则将获取的用户名和密码对象用分号分割,方法与ROM存储基本相同,不过SDCard的存储需要权限,在清单文件中加入权限:

android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE

读入的方法与ROM读入的方法相同。

这个程序就基本完成了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值