数据存储

Android数据存储技术分类

本地数据存储技术

  • SharedPreferences(XML格式数据)

  • File(二进制数据为主)

  • SQLite(关系型数据)
    远程数据存储技术

  • 基于Socket使用TCP/IP直接访问网络服务器(数据从数据源直接传送到目的地)

  • 基于HTTP相关协议访问Web服务(从互联网上获取HTML、json/xml、二进制格式的数据)

SharedPreferences

基本特点

  • 数据以“key-value”方式存储与处理
  • 数据明文存储于xml文件中
  • Android内置相应数据存储组件,使用简单方便

适用场景

  • 比较适用于保存少量的数据,更新不频繁,不需要进行复杂的查询,并且对安全性没有太大要求

使用文件保存数据

基本特点

  • 可以保存任意类型、任意大小的数据,但是需要自行编写数据解析代码
  • Android使用标准Java编程方式,通过Stream存取底层文件

适用场景

  • 保存二进制的,数据量较大的数据(照片、视频等)
  • 有特殊格式的文本型数据
  • 有特殊处理需求的数据(比如数据需要加密后存储)

使用关系数据库存储数据

基本情况

  • Android内置于对SQLite的支持,在android.database.sqlite包中提供了相应的组件
  • SQLite是一种单用户单文件型数据库,文件保存于本机内置存储空间,占用系统资源小,是黑夜手机这种内存受限的运行环境
  • 入股其他App需要访问这些数据,可以使用Content Provider

适用场景

  • 以文本型数据为主
  • 需要进行频繁的CRUD操作

SharedPreferences

  • 在SharedPreferences是一种轻量级的数据存储方式,可以将键/值对的数据,保存在Android的文件系统中,完全屏蔽了文件系统的操作过程
  • 存储在应用程序的私有目录下(data/data/包名/shared-prefs)自己定义的xml文件中
  • SharedPreferences支持整形、布尔型、浮点型、长整形、字符串数据类型,特别适用于保存少量数据,更型不频繁且安全性不高的场合,如:软件配置参数

使用SharedPreferences

  • 操作前,需获取SharedPreferences对象
  • 存储数据步骤:
    1.用SharedPreferences对象的方法edit()获得一个Editor对象
    2.通过putString以键值<String key ,String value>方式把字符串值写入Editor对象中,其他类型数据调用相应的put()方法
    3.最后利用conmmit()或apply()方法提交数据
private void savePrefs(String username){
        SharedPreferences.Editor editor=getSharedPreferences("pref", Context.MODE_PRIVATE).edit();
        editor.apply();
    }

获取SharedPreferences对象

  • 可以通过多种方式获得SharedPreferences对象

  • Context.getSharedPreferences(String name ,int mode)
    1.name为文件名称
    2.mode为操作模式,默认的模式为0或MODE-PRIVATE,还可以使用MODE-READABLE和MODE-WRITEABLE

  • Activity.getSharedPreferences(int mode):只能在当前activity使用,一般不用
    1.使用当前不带包名的类名作为文件的名称
    2.mode为操作模式,默认的模式为0或MODE-PRIVATE,还可以使用MODE-READABLE和MODE-WRITEABLE

SharedPreferences数据读取

  • 从已经保存的SharedPreferences中读取数据
    1.调用getSharedPreferences()函数
    2.通过get()函数获取保存在SharedPreferences中的键值对
private String readPrefs(){
        SharedPreferences prefs=getSharedPreferences("pref",Context.MODE_PRIVATE);
        return prefs.getString("username","");
    }

⚠️注意:
1.勿存储过大的value
2.勿存储复杂的数据,JSON和html格式的数据需要转义
3.建议使用apply,少用commit

文件存取

Android的存储系统
本机内置系统存储

  • /data/data/< package name>/
  • 仅供App自己使用,属“私有数据”
  • App卸载时自动删除

本机外部系统存储

  • /storage/emulated/< package name>/
  • 存储照片、音乐等,属“共享数据”
  • App卸载时保留

外部可扩充存储

  • SD卡上的任意文件夹
  • 可供任意App访问
  • App卸载后仍然保存
  • 不在配置SD卡

Android存储系统的重要的文件夹

  • /data/app:保留各个应用
  • /data/data:各个应用保存私有数据的地方
  • /mnt/scared:代表SD卡的根目录
  • /system:对应用只读,保存Android操作系统文件

Context类的文件管理方法
-
注意:上面各方法所操作的文件及文件夹,位于“/data/data< package name>/”下

数据库存储

SQLite数据库

  • 一种轻量级关系型数据库
  • 占用资源小,只需要几百k内存,特别适合在嵌入式系统中使用
  • 支持标准的SQL语法,支持事务机制
  • Android专门提供了SQLiteOpenHelper类,对数据库进行操作

SQLite的数据类型

  • NULL
  • INTEGER:整数
  • REAL:浮点数
  • TEXT:文本与字符串
  • BLOB:二进制类型的数据

Android数据库编程方式

  • 直接访问:使用SQLiteDatabase类
  • 初步封装:使用SQLiteOpenHelper类
  • 自定义:我们自己封装数据存取代码

直接访问数据库

  • 在Activity中可以调用openOrCreateDatabase()方法创建或打开一个数据库,获取一个SQLiteDatabase对象的引用
  • 创建的数据库存放的目录:/data/data/packageName/databases/
  • 调用SQLiteDatabase类提供的相应方法将SQL命令直接发送给数据库
    1.exeSQL()方法:可以执行insert、delete、update和create table之类有更改行为的SQL语句
    2.rawQuery()方法:可以执行select语句,返回一个Cursor

Cursor对象

  • Cursor是每行数据的集合
  • 使用moveToFirst()定位第一行
  • 必须知道每一列的名称
  • 必须知道每一列的数据类型
  • Cursor是一个随机的数据源
  • 所有的数据都是通过下标取得

SQLiteDatabase实现CRUD

  • 对于常见的CRUD操作,SQLiteDatabase进行了简单的封装,提供了对应的几个方法,拥有N多的参数
    -

SQLiteOpenHelper类

  • SQLiteOpenHelper类是一个用于创建或打开数据库的辅助类
  • SQLiteOpenHelper类是一个抽象类,包含两个重要的方法:
    1.onCreat(SQLiteDatabase db);新建数据库时调用
    2.onUpgrade(SQLiteDatabase db,int oldVersion ,int newVersion):数据库版本升级时调用
  • 构造出实例后调用getWritableDatabase()或getReadableDatabase()方法获取Database对象
  • 创建的数据库存放目录:/data/data/packageName/database/

使用SQLiteOpenHelper
编程套路:
1.从SQLiteOpenHelper派生,提供一个构造函数,重写其onCreat()和onUpdate()方法
2.在Activity中调用getWritableDatabase()方法

    MyDBHelper helper=new MyDBHelper(this);
    SQLiteDatabase db=helper.getWritableDatabase();

ContentProvider

ContentProvider

  • ContentProvider是Android的四大组件之一
  • 不同应用程序之间数据交换的标准API,实现数据在不同应用程序直接的共享
  • 一个程序可以通过ContentProvider的抽象接口,见自己的数据以Uri形式暴露出去,其它应用程序可以使用ContentProvider,根据Uri访问操作指定数据,对应用中的数据进行增删改查
  • 标准的ContentProvider:Android提供一些标准ContentProvider,如:联系人信息、图片库等,可以使用这些ContentProvider访问设备上存储的联系人信息、图片等
  • 开发流程:
    1.定义继承ContentProvider自定义类
    2.在AndroidManifest.xml用< provider>标签注册

URI

  • 统一资源标识符:uniform resource identifier
  • ContentProvider以表的形式组织数据,使用的查询字符串有别于标准的SQL查询,增删改查等操作使用特殊的URI进行
  • URI由3部分组成,content://代表数据的路径和一个可选的表示数据的ID
    1.content://media/internal/images:返回设备上存储的所有图片
    2.content://contacts/people/:返回设备上所有联系人信息
    3.content://contacts/people/45:返回ID为45的单个联系人信息
  • Uri uri=Uri.parse(“content://contacts/people/45”)

管理联系人

  • 调用getContentResolver()获取ContentResolver对象
  • 调用insert()、update()、delete()、query()等方法
  • 在AndroidMainfest配置文件中声明许可
    1.android.permission.READ_CONTACTS
    2.android.permission.WRITE_CONTACTS

ContentProvider的工具类

  • Android提供了3个用于辅助ContentProvider的工具类
    ContentUris:操作URI,核心方法:
    withAppendedID(uri,id):为uri路径加上ID部分
    parseID(uri):解析uri中的ID

  • UriMatcher,在ContentProvider中注册URI,根据URI匹配

  • ContentObserver类:内容观察者,观察uri引起ContentProvider中的数据变化,并通知访问该数据访问者

以上就是对数据存储的整理,在整理过程中也学到了很多,也复习很多知识点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值