2把数据保存到手机内存、SharedPreferences、内存卡中

1. 保存数据到手机内存

因为直接保存到手机内存的app所在包下,所以不需要权限
主要的思路:
1、把EditText的内容取出来
2、把内容放在内存中,文件路径file为(app的包下,两种都可以,第一种是写死了,包名一改就会出错,第二种是动态获取包名):

"/data/data/com.zhansy.myonclick/user.txt"//com.zhansy.myonclick为包名
this.getFilesDir();// /data/data/包名/files

3、在oncreate中判断是否有上次保存的信息,有则显示出来

注:用到Map<String,String>,.put参数对应的key值与需要保存的内容,然后直接get它的key就可以取到内容
//getString(“number”,null);/number为key值

mainActivity:

package com.zhansy.myonclick;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import java.util.Map;

public class MainActivity extends Activity implements View.OnClickListener{
    private EditText editqq;
    private EditText editpsw;
    private CheckBox checkBox;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editqq = (EditText) findViewById(R.id.et_qq);
        editpsw = (EditText) findViewById(R.id.et_psw);
        checkBox = (CheckBox) findViewById(R.id.cb_psw);
        btn = (Button) findViewById(R.id.btn_login);
        btn.setOnClickListener(this);

        //回显数据,当手机内存中存在用户登录信息时,显示出来
        Map<String,String> userInfoMap = UserInfo.getUserInfo(this);
        if (userInfoMap != null) {
            editqq.setText(userInfoMap.get("number"));
            editpsw.setText(userInfoMap.get("password"));
        }
    }

    @Override
    public void onClick(View view) {
        //执行登陆操作

        //1、取出号码和密码
        String qq = editqq.getText().toString();//获得编辑框的QQ号码
        String psw = editpsw.getText().toString();//获得编辑框的QQ密码
        if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(psw)) {
            Toast.makeText(this, "请正确输入账号密码", Toast.LENGTH_LONG).show();
            return;
        }
        //2、判断记住密码是否被选中

        if (checkBox.isChecked()) {
            Log.e("记住密码", "账号为" + qq + "密码为" + psw);
            boolean isSuccess = UserInfo.saveUserInfo(this,qq, psw);
            if (isSuccess) {
                Toast.makeText(this, "保存成功", Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(this, "保存失败", Toast.LENGTH_LONG).show();
            }

        }
        //3、登陆成功
        Toast.makeText(this, "登陆成功", Toast.LENGTH_LONG).show();

    }

}

保存用户信息的类:

package com.zhansy.myonclick;

import android.content.Context;
import android.text.TextUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2015/8/14.
 */
public class UserInfo {


    /**
     * 保存用户信息
     *
     * @param qq
     * @param psw
     * @return true 成功
     */
    public static boolean saveUserInfo(Context context,String qq, String psw) {


        try {
            //this.getFilesDir();   // /data/data/包名/files
//        String path = "/data/data/com.zhansy.myonclick/user.txt";
            File fileDir = context.getFilesDir();
            File path = new File(fileDir, "user.txt");
            FileOutputStream fos = new FileOutputStream(path);
            //用##分割开
            String data = qq + "##" + psw;
            fos.write(data.getBytes());
            fos.flush();//刷新字符流
            fos.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    public static Map<String, String> getUserInfo(Context context) {

        try {
//        String path = "/data/data/com.zhansy.myonclick/user.txt";
            File fileDir = context.getFilesDir();
            File path = new File(fileDir, "user.txt");
            //inputstream是一个一个字节读取的,每次读取都会执行一次IO,我们知道IO操作都是非常耗时的
            FileInputStream fis = new FileInputStream(path);
            //从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取
            BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
            String text = reader.readLine();//一行一行读取
            if (!TextUtils.isEmpty(text)) {//不为空时,取内容出来,TextUtils.isEmpty如果参数为空,也是传回来false
                String[] split = text.split("##");
                Map<String, String> userInfoMap = new HashMap<String, String>();
                userInfoMap.put("number", split[0]);
                userInfoMap.put("password", split[1]);
                return userInfoMap;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

布局文件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:gravity="center"
    android:orientation="vertical">

    <EditText
        android:id="@+id/et_qq"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginRight="20dp"
        android:layout_marginLeft="20dp"
        android:hint="QQ号" />
    <EditText
        android:id="@+id/et_psw"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginRight="20dp"
        android:layout_marginLeft="20dp"
        android:hint="密码" />

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/cb_psw"
        android:text="记住密码"/>
    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登陆" />

</LinearLayout>

2、当用户想保存在SD卡时:

把上面的UserInfo类中的两处改一句话:

//保存在手机内存中
File fileDir = context.getFilesDir();
//保存在sd卡
//File fileDir = Environment.getExternalStorageDirectory();
//我们用sd卡前可以先判断一下当前手机是否有sd卡:
//判断当前手机是否有sd卡
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
     //已经挂载了sd卡
     return false;
}
//保存在sd卡
File fileDir = Environment.getExternalStorageDirectory();

最后加一个读内存卡的权限:

<!--写入SD卡的权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

3、把数据存到SharedPreferences

 //路径:/data/data/包名/share_prefs/user
 SharedPreferences sp = context.getSharedPreferences("user", context.MODE_PRIVATE);//(文件名,权限)
//获得一个编辑对象
SharedPreferences.Editor editor = sp.edit();
///存数据
editor.putString("number", qq);//取数据就是getString("number",null);可以创建HashMap对象,把数据传出去
editor.putString("password", psw);
//提交,数据真正存储起来
editor.commit();

猜你喜欢

转载自blog.csdn.net/azhansy/article/details/50199643
今日推荐