Android开发——数据存储

先编写一个简单的QQ登录界面作为实验界面

<?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:background="@mipmap/qq_login">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:orientation="vertical"
        android:padding="30dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableLeft="@mipmap/ic_launcher"
            android:text="QQ"
            android:textColor="#888888"
            android:textSize="50sp"/>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="30dp"
            android:hint="QQ号码\手机号码\邮箱"
            android:textColorHint="#888888"/>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:hint="密码"
            android:textColorHint="#888888"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="登录"
            android:textSize="20sp"/>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="忘记密码"
                android:textColor="#00aaff"
                android:textSize="16sp"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="新用户注册"
                android:textColor="#00aaff"
                android:textSize="16sp"
                android:layout_alignParentRight="true"/>

        </RelativeLayout>

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="登录即代表阅读并同意相关条款"
        android:layout_marginBottom="50dp"
        android:textColor="#777777"
        android:textSize="20sp"/>

</RelativeLayout>

效果如下

Android开发——数据存储

 

<1>把数据存储到该应用的数据目录(\data)中

首先对登录按钮、账号输入框、密码输入框这三个控件设置id

然后对登录按键设置监听事件(点击登录按钮,就会触发监听事件,将账号框和密码框中的内容存储起来)

  private void handlerLoginEvent(View v){
        //点击登录按钮后,要拿到界面上的内容(账号和密码)
        String accountText = account.getText().toString();
        String passwordText = password.getText().toString();

        //把账户和密码保存起来
        //利用流把它们写到文件中保存起来
        saveUserInfo(accountText,passwordText);
    }

    private void saveUserInfo(String a,String p){
        //把账号和密码存储起来的方法
        Log.d(TAG,"保存用户的账号和密码...");
        try {
            File file = new File("/data/data/com.example.qq_logindemo/zhanghu.txt");
            if(!file.exists()){
                file.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(file);
            //以特定的格式来存储:账号***密码
            fos.write((a +"***" + p).getBytes());
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

——这里需要注意的是,文件保存的路径如何确定?

如果我们直接写File file=new File("zhanghu.txt")是会出错的,因为Android系统是基于Linux系统的,不像windows系统一样有C盘D盘之类的盘进行区分,它的根目录就是"/"

而每一个Android程序就是一个用户,在linux下权限的划分非常清楚,每一个用户只能操作自己的数据,具有安全性

所以我们必须将账号和密码的信息保存到我们的这个qq_logindemo应用的数据目录中才可以

 

——如何找到具体路径呢?

打开cmd,输入adb devices查看我们的虚拟设备

输入adb shell进入该设备的Android内核

输入ll查看目录可以看到有一个data文件夹

进入data文件夹中,可以看到还有一个data文件夹,再次进入(即cd data,再次cd data)

在/data/data目录下我们再次ll查看目录,就可以看到我们应用程序的数据文件地址了

Android开发——数据存储

com.example.qq_logindemo就是我们的应用程序数据地址(也可以在AS中我们的项目中manifests下的AndroidManifest.xml中找到验证)

Android开发——数据存储

当我们在手机上输入账号和密码,按下登录按键后,就会在该程序的目录下创建了一个zhanghu.txt文本按照"账号***密码"的格式存储我们的数据,验证一下:

Android开发——数据存储

 

<2>查看保存的数据

——第一种方式:在Android系统内核中用linux命令 cat zhanghu.txt 查看文本文件的内容

 

——第二种方式:在AS中,上方菜单栏View中选择Tool Windows中的Devices File Explorer即可

Android开发——数据存储

然后即可在AS中查看到该设备的所有文件,找到/data/data/com.example.qq_logindemo/zhanghu.txt打开即可看到

Android开发——数据存储

 

<3>获取文件保存路径的另一种方法——利用系统自带的API

在第一个模块中, 我们选择了通过adb命令进入Android内核,然后再用Linux系统的相应操作找到文件存储的位置

其实还有一种更便捷的方式,直接在代码里用系统自带的API即可

private void saveUserInfo(String a,String p){
        //把账号和密码存储起来的方法
        Log.d(TAG,"保存用户的账号和密码...");

        //利用API获取文件保存的路径
        File filesDir = this.getFilesDir();
        //输出文件保存的路径
        Log.d(TAG,"files dir == " + filesDir.toString());
        //利用API获取的路径来自动在下面创建一个文本,保存账号和密码
        File saveFile = new File(filesDir,"zhanghu.txt");

        try {
            /*
            File file = new File("/data/data/com.example.qq_logindemo/zhanghu.txt");
            if(!file.exists()){
                file.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(file);
             */
            if(!saveFile.exists()){
                saveFile.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(saveFile);
            //以特定的格式来存储:账号***密码
            fos.write((a +"***" + p).getBytes());
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

(即 this.getFileDir() 方法拿到的路径就是 /data/data/包名/files 这个路径)

(同理,获取缓存文件存储的路径也是有相应的方法 this.getCacheDir() )

缓存文件,保存在cache目录中,会由系统根据存储情况自动进行清理

而files目录下是我们自己保存文件的地址,可以通过代码删除,也可以通过手机里的应用列表中的选项进行删除数据

 

<4>对输入的数据进行判空

在设计qq登录界面时,需要对输入的账号密码进行各种检查

(在实际开发中,各种合法性检查一般交给后台处理)

这里对账号和密码的判空处理进行练习,两种方法

Android开发——数据存储

 

<5>把存储的账号和密码从文件中读取出来,回显到界面上

Android开发——数据存储

 

<6>把数据存储到SD卡中

在Android设备中,其实是有两种存储空间:

——一是系统内部存储空间:ROM,就类似于Windows系统的C盘,在Android系统中只有一个ROM盘,因为它是基于Linux系统的

——二是外置存储空间:也就是SD卡等外部存储设备,类似于Windows系统的外插存储设备

 

首先,外部存储设备在Linux系统中是需要挂载的

adb devices,然后adb shell 进入Android内核,然后 cd /mnt 即可进入挂载的目录

ll查看sd卡所挂载的路径

Android开发——数据存储

 

然后写代码,设置一个点击按键,点击后往SD卡中存储数据

需要注意的是,往SD卡中存储和读取数据也是要获取权限的

我们要在AndroidManifest.xml中配置一下,加入读写权限

Android开发——数据存储

然后在界面点击按键,去挂载SD卡的路径中就可以看到新建的一个文件了

Android开发——数据存储

 

<7>使用API获取SD卡路径以及判断SD卡是否挂载以及查看SD卡剩余存储空间大小

和前面的获取数据的内部存储路径一样,SD卡的路径也可以通过调用API来实现

File exFile = Environment.getExternalStorageDirectory();

这种方法的好处是什么呢?

一是避免写错,二是因为不同的手机厂商,它们默认的SD卡路径名不一样,通过这个API,可以便捷得获取到SD卡的路径

 

如何判断是否挂载了SD卡?

也可以通过一个API

Android开发——数据存储

 

如何查看SD卡剩余的存储空间大小?

Android开发——数据存储

 

<8>编写设置界面SharedPreference

SharedPreference一般用于保存偏好设置,例如手机设置界面里的各个选项

(在Android系统中,分为内部存储和外部存储,而内部存储又分为以下几种路径:

——/data/data/包名/files:存储文件

——/data/data/包名/caches:存储缓存

——/data/data/包名/databases:存储数据库

——/data/data/包名/shared_prefs:存储设置,也就是用户偏好)

 

SharedPreference的使用步骤:

1.首先拿到这个SharedPreference

用this.getSharedPreference()方法,里面的两个参数第一个是表示存储的文件名称,第二个表示权限

2.进入编辑模式,拿到编辑器

3.保存数据

edit.putBoolean("键名称", 值);

可以保存的类型有String,float,StringSet,int

4.提交编辑器

edit.commit();

通过这四步,我们即可将数据保存在SharedPreference里了

Android开发——数据存储

 

SharedPreference中的数据回显?

Android开发——数据存储

 

SharedPreference存储的数据都是键值对

 

上一篇:树莓派 格式化内存卡(无需安装软件)


下一篇:手把手教你在显示器的情况下使用树莓派