Android基础学习(十八)—— 数据存储

瞬时数据:存储在内存中,有可能会因为程序关闭或其他原因导致内存被回收而丢失的数据

数据持久化:将内存中的瞬时数据保存到存储设备中

Android系统中主要提供了3种方式用于简单地实现数据持久化功能:

  • 文件存储。对应的目录是:/data/data/<包名>/files/*
  • SharedPreferences存储。对应的目录是:/data/data/<包名>/shared_prefs
  • 数据库存储。对应的目录是:/data/data//<包名>/database

一、文件存储

适合用于存储一些简单的文本数据或二进制数据

1、将数据存储到文件中
Context.openFileOutput(文件名, 操作模式)

参数:

(1)文件名

不可以包含路径,默认存储到 /data/data/<包名>/files/ 目录下

(2)操作模式

1)MODE_PRIVATE

默认的模式。当指定同样的文件名时,所写入的内容将会覆盖原文件中的内容

2)MODE_APPEND

表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。

返回值:

FileOutputStream对象

代码示例:

public void save(){
    String data = "Data to save";  //要进行文件存储的数据
    FileOutputStream out = null;
    BufferedWriter writer = null;
    try{
        out = openFileOutput("data", Context.MODE_PRIVATE);
        writer = new BufferedWriter(new OutputStreamWriter(out));
        writer.write(data);
    }catch(IOException e){
        e.printStackTrace();
    }finally{
        try{
            if(writer != null){
                writer.close();
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}
2、从文件中读取数据
Context.openFileInput(要读取的文件名)

系统会自动到 /data/data/<包名>/files/目录下去加载这个文件,并返回一个FileInputStream对象

public String load(){
    FileInputStream in = null;
    BufferedReader reader = null;
    StringBuilder content = new StringBuilder();
    try{
        in = openFileInput("data");
        reader = new BufferedReader(new InputStreamReader(in));
        String line = "";
        while((line = reader.readLine()) != null){
            content.append(line);
        }
    }catch(IOException e){
        e.printStackTrace();
    }finally{
        if(reader != null){
            try{
                reader.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
    return content.toString();
}

二、SharedPreferences存储

   SharedPreferences基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息,其存储位置在“/data/data/<包名>/shared_prefs”目录下。

   SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现的。

1、使用SP存取数据

(1)存储数据:

示例代码:

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",28);
editor.putBoolean("married", false);
editor.commit();

其中,获取SP对象有三种方式

①Context类中的getSharedPreferences()方法

Context.getSharedPreferences(文件名, 操作模式)

文件名:如果文件不存在则会创建一个,将指定的文件存放在“/data/data/<包名>/shared_prefs”目录下

操作模式:目前只有MODE_PRIVATE这一种模式,是默认的操作模式,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写

②Activity类中的getPreferences()方法

Activity.getPreferences(操作模式)

类似于Context.getSharedPreferences方法,但此方法自动将当前活动的类名作为SP的文件名。

③PreferenceManager类中的getDefaultSharedPreferences()方法

PreferenceManager.getDefaultSharedPreferences(Context)

静态方法。

自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。

(2)读取数据

示例代码:

SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
String name = pref.getString("name", "默认值");
int age = preg.getInt("age", 0);
boolean married = pref.getBoolean("married", false);

(3)删除指定数据

示例代码:

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.remove("name");
editor.commit();

(4)清空数据

示例代码:

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.clear();
editor.commit();
2、关于SP的一些注意事项

(1)SP加载的主要过程
在这里插入图片描述

SP加载的主要过程:

1)找到对应name的文件

2)加载对应文件到内存中的SP

3)一个xml文件对应一个SP单例

(2)提交数据时的commit()方法和apply()方法

提交数据时有commit和apply两种方式:

1)apply没有返回值而commit返回boolean表明修改是否提交成功 ;

2)commit是把内容同步提交到硬盘的,而apply先立即把修改提交到内存,然后开启一个异步的线程提交到硬盘,并且如果提交失败,你不会收到任何通知。

3)所有commit提交是同步过程,效率会比apply异步提交的速度慢,在不关心提交结果是否成功的情况下,优先考虑apply方法。

4)apply是使用异步线程写入磁盘,commit是同步写入磁盘。所以我们在主线程使用的commit的时候,需要考虑是否会出现ANR问题。(不适合大量数据存储)

(3)Sharedpreferences只适合做轻量级存储的原因

1)我们在初始化SharedPreferencesImpl对象时会将SharedPreferencesImpl对应的xml文件中的所有数据都加载到内存中,如果xml文件很大,将会占用大量的内存,我们只想读取xml文件中某个key的值,但我们获取它的时候是会加载整个文件。

2)在UI线程中调用getXXX可能会导致ANR。

3)每添加一个键值对,都会重新写入整个文件的数据,不是增量写入。

(4)Sharedpreferences支持的数据类型

只能存储boolean,int,float,long和String五种简单的数据类型

三、SQLite

1、简介

关系型数据库

嵌入式的数据库(嵌入在Android系统中)

用于嵌入式设备:手表、手机

2、SQLite数据库的使用

Android SQlite数据库使用详解

3、SQLite支持的数据类型

SQLite的数据类型

SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本) 和 BLOB(二进制对象)这五种数据类型,

虽然它支持的类型只有五种,但实际上 sqlite3 也接受 varchar(n)、char(n)、decimal(p, s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值