android数据持久化

1、数据持久化

1.1 定义

数据持久化就是将内存中的瞬时数据保存到存储设备中,保证即使在手机或者是电脑关机的情况下,数据也不会丢失。

1.2 方式

在android中数据持久化分为三种:文件存储、SharedPreferences存储和数据库存储。

1.3 三种方式对比

数据持久化三种方式对比

方式保存路径涉及到的类特点
文件存储/data/data/<packagename>/files///从文件中读取数据
Context.openFileInput(String fileName):FileInputStream 
//将数据存储到文件中
Context.openFileOutput(String fileName, int mode):FileOutputStream 
不对存储的内容进行任何的格式化处理,比较合适存储一些简单的文本数据或二进制数据
SharedPreferences存储/data/data/<packagename>/shared_prefs/Context.getSharedPreferences(String name, int mode):SharedPreferences
Activity.getPreferences(int mode):SharedPreferences
PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences
使用键值对的方式来存储数据,保存数据更加方便。数据以明文的方式保存在文件中,需要加密
数据库/data/data/<packagename>/databases/SqLiteOpenHelper类、SQLiteDatabase类可以保存大量复杂的关系型数据 


2、文件存储

2.1 存储数据

    调用的方法:Context.openFileOutput(String fileName, int mode):FileOutputStream

    其中,mode的值有两个,分别为:Context.MODE_PRIVATE和Context.MODE_APPEND

    Context.MODE_PRIVATE:为默认模式,表示当指定相同文件名的时候,会覆盖原有文件。

    Context.MODE_APPEND:表示文件已经存在时,会将内容追加到之前的文件中。

    下面是一个例子:

    /**
     * 保存数据
     * @param view
     */
    public void saveData(View view){
        String text = inputText.getText().toString();
        if(!TextUtils.isEmpty(text)){
            FileOutputStream fileOutputStream = null;
            BufferedWriter fileWriter = null;
            try{
//                fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_PRIVATE);//每次文件都是会被覆盖掉
                fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_APPEND);//在原有文件的基础之上追加内容
                fileWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
                fileWriter.write(text);
                fileWriter.write("\r\n");
            }catch (FileNotFoundException e){
                Log.e(TAG, "saveData: 文件不存在");
            }catch (IOException e){
                Log.e(TAG, "saveData: IOException"+e.getMessage() );
            }finally {
                try {
                    if (null != fileWriter) {
                        fileWriter.close();
                    }
                }catch (IOException e){
                    Log.e(TAG, "finally: IOException"+e.getMessage() );
                }
                inputText.setText("");
            }
        }
    }

2.2 读取数据

    从文件中读取数据Context.openFileInput(String fileName):FileInputStream

     示例代码:

    /**
     * 读取数据
     * @param view
     */
    public void readData(View view){
        FileInputStream fileInputStream = null;
        BufferedReader bufferedReader = null;
        try {
            fileInputStream = FilePersistenceActivity.this.openFileInput(FILENAME);
            bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
            String readLine = null;
            StringBuffer stringBuffer = new StringBuffer();
            while (!TextUtils.isEmpty(readLine = bufferedReader.readLine())){
                stringBuffer.append("\r\n");
                stringBuffer.append(readLine);
            }
            inputtedText.setText(stringBuffer.toString());
        }catch (FileNotFoundException e){
            Log.e(TAG, "readData:" +e.getMessage());
        }catch (IOException e){
            Log.e(TAG, "IOException:" +e.getMessage());
        }finally {
            try {
                if(null != bufferedReader){
                    bufferedReader.close();
                }
            }catch (IOException e){
                Log.e(TAG, "IOException:" +e.getMessage());
            }
        }
    }

3、SharedPreferences

    3.1 三种不同的实现方式对比

    在这个程序中,对应的包名为:ed84947b9b021aa54b48d1a03e62f7159ce.jpg

三种不同的实现方式对比

实现方式方法解析保存的文件名
Context.getSharedPreferences(String name, int mode):SharedPreferences

name:SharedPreferences文件的名称.

mode:目前只有MODE_PRIVATE这一种模式,是默认操作,表示只有当前的程序才可以对此SharedPreference进行操作

name所定义的名字

53e61392518178bcb7ea928665b2094f8ac.jpg

Activity.getPreferences(int mode):SharedPreferences 

当前活动的类名作为文件名

78a882827cb702e51620c9c75367418e8fe.jpg

PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences 

当前应用程序包名作为前缀

fe5307681c7a894482db9b89b909118e2f8.jpg

    3.2 保存数据

        调用SharedPreferences.Editor类,使用putXXX()方法,然后调用SharedPreferences.Editor的apply()即可。具体使用哪一个put方法,根据数据类型来决定。

    3.3 读取数据

        直接调用SharedPreferences类的getXXX()方法。具体调用哪一个get方法,根据数据类型来决定。

4、数据库

    Android主要使用Sqlite数据库作为系统默认数据库。

4.1 主要涉及到的类

    主要涉及到SQLiteOpenHelper和SQLiteDatabase这两个类。SQLiteOpenHelper是一个接口,主要负责数据库的创建和升级。SQLiteDatabase类主要负责执行对应的sql语句。

    SQLiteOpenHelper接口有onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)这两个方法需要重写,onCreate方法在数据库初次被创建时调用。onUpgrade方法,在传入的newVersion参数发生改变的时候,进行调用。newVersion参数,在SQLiteOpenHelper的构造方法中传入。

    其中SQLiteDatabase可以通过SQLiteOpenHelper类的getWritableDatabase()和getReadableDatabase()这两个方法获得。当数据库不可以写入的时候,调用getWritableDatabase()会出现异常。调用这两个方法的过程中,会创建或者打开已有的数据库文件。

4.2 执行增删改查所对应的方法

    对于数据库的增加、修改、和删除操作都可以直接调用execSQL方法,但是查询就需要调用rawQuery方法。

    具体事例如下:

sqLiteDatabase.exeSql("delete from book where name = ?",new String[]{"java"});
sqLiteDatabase.exeSql("update book set price = ? where name = ?",new String[]{"123","java"});
sqLiteDatabase.exeSql("insert into book(name,author,price)values(?,?,?);",new String[]{"java","cxy","23.56"});
Cursor cursor = sqLiteDatabase.rawQuery("select * from book",null);

4.3 数据库中主要的数据类型

    integer表示整形,real表示浮点型,text表示文本类型,blob表示二进制类型。

转载于:https://my.oschina.net/u/2253892/blog/2223637

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值