我是靠谱客的博主 虚心大树,最近开发中收集的这篇文章主要介绍Android学习之五种数据存储方式(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

                                          Android学习之数据存储方式

        实际开发Android应用程序时,数据的存储与操作是必不可少的。在这里我主要介绍Android中实现数据存储的5种方式,分别是:
        1、SharedPreferences存储数据
        2、文件存储数据
        3、SQLite数据库存储数据
        4、ContentProvider存储数据
        5、网络存储数据

        今天我们主要学习前两种数据存储方式。
        1、SharedPreferences存储数据
        (1)、一种常用的数据存储方式。
        (2)、本质是基于xml文件存储键值对(key-value)数据。
        (3)、其只能读取数据,存储和修改需要通过Editor对象实现。
        (4)、SharedPreferences将数据以键值对(key-value)的形式保存至xml文件中,而生成的xml文件保存于/data/data/程序包名/shared_prefs目录下。
        (5)、SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据,但只能保存基本类型的值 ,所以,适用于简单的数据保存,一般用于变量的存储。
        1.1、SharedPreferences对象的常用方法:

方法说明
contains(String key) 判断SharedPreferences是否包含特定名称为键(key)的数据,返回值类型为boolean,是返回true,否返回false。
edit() 获取SharedPreferences数据里全部的键值对(key-value),返回值类型为Map<String, Object>。
getAll() 返回一个Edit对象,用于操作SharedPreferences,返回值类型为Editor。
getXxx(String key, Xxx defValue) 获取SharedPreferences指定键(key)所对应的值(value),其中Xxx表示不同的数据类型。

        1.2、SharedPreferences.Editor对象的常用方法 :

方法说明
clear() 清空SharedPreferences里所有的数据。
putXxx(String key,Xxx value) 向SharedPreferences存入指定的key对应的数据,其中Xxx与之前所述相同一样,表示不同的数据类型。
commit() 当Editor编辑完成后,调用该方法可以提交修改,相当于数据库中的提交操作。无论对SharedPreferences对象进行了什么操作,最后都必须使用commit()方法进行保存,否则将无法存储修改信息。返回值类型为boolean,提交成功返回true,失败返回false。
remove(String key) 删除SharedPreferences里指定key对应的值。返回值类型为Editor。

        1.3、SharePreferences的四种操作方式 :

方法说明
Context.MODE_PRIVATE 默认操作,SharePreferences数据只能被本应用程序读、写,写入的内容会覆盖原文件的内容。
Context.MODE_APPEND 检查SharePreferences文件是否存在,没有就创建新的SharePreferences文件或存在就追加写入SharePreferences文件中。
Context.MODE_WORLD_READABLE SharePreferences文件可被其他应用读取,但是不能写入。
Context.MODE_WORLD_WRITEABLE SharePreferences文件可被其他应用读取并写入。

        1.4、两种获取SharedPreferences对象的方法
        (1)、使用Contex.getSharedPreferences(String name,int mode)获取.
        Name为配置文件的名称,mode为操作方式,可被同一应用程序下的其他组件共享。
        (2)、使用Activity.getPreferences(int mode)获取.
        (只能在本Activity中使用。
        1.5、使用SharedPreferences存取数据
        保存数据:
                1.通过Context或Activity获取SharePreferences对象
                2.使用SharePreferences的edit获取SharePreferences.Editor对象
                3.使用Editor对象的putXXX方法保存key-value数据对
                4.使用Editor对象的commit方法提交数据,进行实际存储
        获取数据:
                1.通过Context或Activity获取SharePreferences对象
                2.使用SharePreferences对象的getXXX方法来获取数据

        2、文件存储数据
        文件存储可以分成两类 :
        1、将文件存储在应用程序内,文件保存在/data/data/<package name>/files/目录下,称为File存储;
        2、将文件存储在外接的存储设备中,也就是存储在SDCard存储卡中,称为SDCard存储。
        2.1、File存储
        Android中读取/写入文件的方法与java中的I/O操作一样。利用openFileInput()方法与FileInputStream()对象读取设备上的文件,并利用openFileOutput()方法与FileOutputStream()对象来创建文件,但File存储下,文件在不同的程序之间不能共享。
        2.1.1、使用FileOutputStream类对象来创建文件信息:
        • 使用OpenFileOutput(string name, int mode)函数创建对象,name为文件名,不需要路径信息和扩展名;mode为操作方式。
        • 使用对象的.write(byte[] bytes)来写入二进制文件流,若为其它类型数据,则需要转换为二进制类型。
        • 使用对象的.close()来关闭对象。

        2.1.2、使用FileInputStream类对象来读取文件信息:
        • openFileInput(String name)创建对象。
        • 使用对象的.read(byte[] bytes)来读取二进制文件流。
        • 将读取的二进制数据流,转换为原本的数据信息。

        2.1.3、File存储常用操作:

方法说明
openFileOutput(String name, int mode) 保存文件内容,打开指定的私有文件输出流,返回值类型为FileOutputStream,name为要打开的文件名,不能包含路径分隔符,mode四种模式如下,在使用模式时,可以用"+"来选择多种模式,比如openFileOutput(FileName, Environment.MODE_PRIVATE+MODE_WORLD_READABLE)。
openFileInput(String name) 读取文件内容,打开指定的私有文件输出流,返回值类型为FileInputStream,name为要打开的文件名,不能包含路径分隔符,对于File存储所创建的文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Environment.MODE_WORLD_READABLE和Environment.MODE_WORLD_WRITEABLE权限。
deleteFile(String name) 删除指定的文件,返回值类型为boolean,name为要删除的文件名,不能包含路径。
getDir(String name, int mode) 在应用程序的数据文件下获取或创建name对应的子目录,返回值类型为File。
getFilesDir() 得到该应用程序数据文件夹的绝对路径,返回值类型为File。
fileList() 得到该应用程序数据文件夹下的全部文件的文件名,返回值类型为String[]。

        • mode为操作模式,有以下4种保存模式:
         Environment.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下写入的内容会覆盖原文件的内容。
         Environment.MODE_APPEND:检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
         Environment.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
         Environment.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

        2.2、SDCard存储
        Android为我们提供了SDCard的相关方法方便我们的操作。
        2.2.1、Environment类的常用方法:

方法说明
getDataDirectory() 获得Android下的data文件夹的目录,返回值类型为File。
getDownloadCacheDirectory() 获得AndroidDownload/Cache内容的目录,返回值类型为File。
getExternalStorageDirectory() 获得Android外部存储器也就是SDCard的目录,返回值类型为File。
getRootDirectory() 获得Android下的root文件夹的目录,返回值类型为File。
getExternalStorageState() 获得Android外部存储器的当前状态,返回值类型为String,有以下几种保存模式。

        •保存模式:
        Environment.MEDIA_BAD_REMOVAL:在没有正确卸载SDCard之前就移除。
        Environment.MEDIA_CHECKING:正在磁盘检查。
        Environment.MEDIA_MOUNTED:已经挂载并且拥有可读可写权限。
        Environment.MEDIA_MOUNTED_READ_ONLY:已经挂载, 但只拥有可读权限。
        Environment.MEDIA_NOFS:对象空白, 或者文件系统不支持。
        Environment.MEDIA_REMOVED:已经移除扩展设备。
        Environment.MEDIA_SHARED:如果SDCard未挂载, 同时通过USB大容量存储方式与其他设备共享。
        Environment.MEDIA_UNMOUNTABLE:不可以挂载任何扩展设备。
        Environment.MEDIA_UNMOUNTED:已经卸载。

        2.2.2、对SDCard的写入与读取操作:
        •1. 在AndroidMainfest.xml中添加权限。

<!--在SDCard中读取/写入文件权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--在SDCard中创建与删除文件权限-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

        在API23以上,还要在JAVA代码中添加请求权限:

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE};
        
public static void verifyStoragePermissions(AppCompatActivity activity) {
    int permission = ActivityCompat.checkSelfPermission(activity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE);
    }
}

        •2. 判断手机设备上是否有SDCard且具有读写SDCard的权限,用Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)来判断。
        •3.获取SD卡的目录。
            File sdCardDir=Enviroment.getExternalStorageDirectory()。
            或File sdCardDir=new File(“/sdcard”); //直接访问默认目录。
        ☆☆☆•4.使用File类来写入SD卡文件。
        •使用File类的构造函数设置SD卡文件,并指明路径和名称。
            File savefile=new File(String dir, String filename)。
        •创建FileOutputStream类对象来绑定File对象。
            FileOutputStream fos= new FileOutputStream(savefile)。
        •通过FileOutputStream类对象将数据流写入到文件中。
            fos.write(byte[] bytes)。
        ☆☆☆•5.使用File类来读取SD卡文件。
        •使用File类的构造函数设置SD卡文件,并指明路径和名称。
            File readfile=new File(String dir, String filename)。
        •创建FileInputStream类对象来绑定File对象。
            FileInputStream fis= new FileOutputStream(readfile)。
        •通过FileInputStream类对象将数据流写入到文件中。
            定义一个byte[] 数组,用来存放读取的二进制数据流。
            使用fis.read(byte[] bytes)的方法,从文件读取二进制数据流。
            将二进制数据转化为原有的数据类型。

        ☆☆☆Android Studio实现SharedPreferences存储数据和文件File存储数据。
        1.打开Android Studio,新建工程后,在activity_main.xml中,建立4个Button,2个Plain Text。
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    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="lession.example.com.androidlession4_10_3.MainActivity">
    
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true">
        
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text="name"
            android:ems="10"
            android:id="@+id/editText" />
            
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text="pwd"
            android:ems="10"
            android:id="@+id/editText2" />
            
        <Button
            android:text="sp_save"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/button" />
            
        <Button
            android:text="sp_load"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/button2" />
            
        <Button
            android:text="data_save"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/button3" />
            
        <Button
            android:text="data_load"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/button4" />
    </LinearLayout>
</RelativeLayout>

        2.在MainActivity.java中,编写相关代码。

package lession.example.com.androidlession4_10_3;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {
    SharedPreferences msp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        msp = getSharedPreferences("myfile", Context.MODE_PRIVATE);
        final EditText ed_name = (EditText) findViewById(R.id.editText);
        final EditText ed_pwd = (EditText) findViewById(R.id.editText2);
        Button bt_sps = (Button) findViewById(R.id.button);
        Button bt_spl = (Button) findViewById(R.id.button2);
        Button bt_datas = (Button) findViewById(R.id.button3);
        Button bt_datal = (Button) findViewById(R.id.button4);
        bt_sps.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor mEdt = msp.edit();
                mEdt.putString("name",ed_name.getText().toString());
                mEdt.putString("pwd",ed_pwd.getText().toString());
                mEdt.commit();
            }
        });
        bt_spl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ed_name.setText(msp.getString("name",null));
                ed_pwd.setText(msp.getString("pwd",null));
            }
        });
        bt_datas.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    FileOutputStream mfos = openFileOutput("datafile",MODE_PRIVATE);
                    String st = ed_name.getText().toString();
                    byte[ ] buffer = st.getBytes();
                    mfos.write(buffer);
                    mfos.flush();
                    mfos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        bt_datal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    FileInputStream mfis = openFileInput("datafile");
                    int len = mfis.available();
                    byte[ ] buffer = new byte[len];
                    mfis.read(buffer);
                    String st = new String(buffer);
                    ed_pwd.setText(st);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }
}

        运行结果:

        SharedPreferences存储数据:
        输入任意姓名和密码,点击SP_SAVE,清除文本框中内容后,点击SP_LOAD,输入的姓名和学号又会显示出来。

                                        在这里插入图片描述

        打开Tools —> Android —> Android Device Monitor,找到myfile。
        注:如果打开Android Device Monitor没有目录树,请参考我的另一篇博客,链接:https://blog.csdn.net/weixin_43468667/article/details/90214551
        在这里插入图片描述
        导出,打开内容如下:
        在这里插入图片描述
        文件File存储数据:
        在第一个文本框输入任意字符,点击DATA_SAVE,点击DATA_LOAD,在第二个文本框显示出来。
                                        在这里插入图片描述
        打开Tools —> Android —> Android Device Monitor,找到datafile。
        在这里插入图片描述
        导出,打开内容如下:
        在这里插入图片描述

        ☆☆☆Android Studio实现文件SDCard存储数据。
        1.打开Android Studio,新建工程后,在AndroidMainfest.xml中添加权限。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="lession.example.com.androidlession417">
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <!--在SDCard中读取/写入文件权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--在SDCard中创建与删除文件权限-->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
</manifest>

        2.在activity_main.xml中,建立3个Button,1个ListView。
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    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="lession.example.com.androidlession417.MainActivity">
    
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
        <Button
            android:text="sd_save"
            android:textAllCaps="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/button" />
            
        <Button
            android:text="sd_load"
            android:textAllCaps="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/button2" />
            
        <Button
            android:text="sd_dir"
            android:textAllCaps="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/button3" />
            
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/listView" />
            
    </LinearLayout>
</RelativeLayout>

        3.在MainActivity.java中,编写相关代码。

package lession.example.com.androidlession417;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {

    // Storage Permissions
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};
            
    public static void verifyStoragePermissions(AppCompatActivity activity) {
        int permission = ActivityCompat.checkSelfPermission(activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
                
        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE);
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bt_sdsave = (Button) findViewById(R.id.button);
        Button bt_sdsload = (Button) findViewById(R.id.button2);
        Button bt_sddir = (Button) findViewById(R.id.button3);
        final ListView lv = (ListView) findViewById(R.id.listView);
        verifyStoragePermissions(this);
        bt_sdsave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File path = Environment.getExternalStorageDirectory();
                String st = "我要写入的文件的内容!";
                File saveFile = new File(path,"mySDfile");
                try {
                    FileOutputStream mfos = new FileOutputStream(saveFile);
                    mfos.write(st.getBytes());
                    mfos.flush();
                    mfos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        bt_sdsload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File path = Environment.getExternalStorageDirectory();
                String st;
                File loadFile = new File(path,"mySDfile");
                try{
                    FileInputStream mfis = new FileInputStream(loadFile);
                    int len = mfis.available();
                    byte[] buffer = new byte[len];
                    mfis.read(buffer);
                    st = new String(buffer);
                    Toast.makeText(MainActivity.this,
                            "文件内容:"+st,Toast.LENGTH_LONG).show();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
        /*遍历SD卡中目录及文件的方法:
        通过创建File[]数组类型对象获取
		File[] files=new File(filepath).listFiles();
		使用ListView控件来显示目录
		使用ArrayAdapter将目录中的信息,绑定到ListView中显示
		使用ListView控件的点击事件,来进入选中的目录
	主要函数实现:
		获取选定文件夹中的文件列表
		将文件列表显示到到ListView中*/
        bt_sddir.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File path = Environment.getExternalStorageDirectory();
                File[] mFs = new File(path.toString()).listFiles();
                ArrayAdapter<File> mAda = new ArrayAdapter<File>
                        (MainActivity.this,android.R.layout.simple_list_item_1,mFs);
                lv.setAdapter(mAda);
            }
        });
    }
}

        运行结果:

        点击ALLOW
                                        在这里插入图片描述
        实现SD卡文件的读写:
        点击sd_save,然后点击sd_load显示保存的内容
        实现遍历SD卡中目录及文件:
        点击sd_dir,ListView显示内容

                                        在这里插入图片描述
        打开Tools —> Android —> Android Device Monitor,找到对应文件。
        在这里插入图片描述
        导出,打开内容如下:
        在这里插入图片描述

        这就是SharedPreferences存储数据和文件存储数据的使用,如果转载以及CV操作,请务必注明出处,谢谢!

最后

以上就是虚心大树为你收集整理的Android学习之五种数据存储方式(一)的全部内容,希望文章能够帮你解决Android学习之五种数据存储方式(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部