Android的三种数据存储方案

#Android:
###6.数据持久化的三种储存方式:
####1.文件存储
(1)方法介绍:

android中的context类提供了一个openFileOutPut()的方法,可以将数据存储到指定文件中。该方法接收两个参数,第一个是文件名,第二个是文件操作模式

对于文件名,注意不可以包含路径,因为所有文件都是默认存储到指定目录下的(data/data/(package name)/files/)
对于第二个参数,主要选择两种:

  • MODE_PRIVATE:该方式为默认操作方式,表示指定同样文件名时,所写入的内容会覆盖原文件中的内容

  • MODE_APPEND:如果该文件已存在,则往文件里追加内容。不存在则创建新文件

此外,MODE_WORLD_READAVLE和MODE_WORLD_WRITEABLE两种模式允许其他程序对我们程序中文件进行读写操作,由于这两种模式过于危险易引起安全性问题,已在Android4.2中被废弃

(2) 操作流程:
通过openFileOutPut()的方法得到一个FileOutputStream对象,再借助它构造一个OutputStreamWriter对象,再使用OutputStreamWriter构建一个BufferedWriter对象,就完成了将文本写入文件中的操作了

(3) 适用范围:
适用于存储一些见到的文本数据或二进制数据

·(4)文件中读取数据:
① 方法介绍:
与上面类似,context类提供了一个openFileInput()方法,用于从文件中读取数据。该方法只接受一个参数,即所读取文件的文件名,系统会自动到指定目录下加载数据,返回一个FileInputStream对象,之后通过java流将数据读取出来(data/data/(package name>/files/)

② 操作流程:
通过openFileInput()方法获得一个FileInputStream对象,然后借助它构建出一个InputStreamReader对象,接着再使用InputStreamReader构建出一个BufferedReader对象,通过BufferedReader将内容读取并存放在一个StringBuilder,最后将内容返回就可以了

·(5)总结:
文件存储的核心技术:
context类中的两个方法:
openFileInput()方法:读取
openFileOutput()方法:存储
之后再利用java的各种流进行读写操作

###2.Sharedpreference存储
(1)方法介绍:

通过键值对的方式存储数据且支持多种不同数据类型存储。

对于获取SharedPreferences对象有三种方法:

[1].context类中getSharedPreference()方法
该方法接受两个参数,第一个参数用于指定SharedPreferences文件名称,如果指定文件不存在则创建一个,第二个参数用于指定操作模式,目前只有MODE_PRIVATE一种模式可选,也是默认的操作模式,表示只有当前应用程序才能对这个sharedPreference文件进行读写,MODE_WORLD_READAVLE和MODE_WORLD_WRITEABLE和MODE_MULTI_PROCESS模式都已废弃

[2].Activity中的getSharedPreference()方法
该方法与上述[1]类似,但它只接受一个操作模式参数,因为使用这个方法会将当前活动的类名作为SharedPreferences的文件名

[3].PreferenceManager类中getDefaultSharedPreference()方法
这是一个静态方法,它接收一个context参数并自动使用当前应用程序的包作为前缀来命名sharedPreference文件

对于添加数据,添加什么类型数据就调用editor中哪一类方法,如putString()中为字符串型数据,putInt()为int型数据

(2)操作流程:
[1].获取一个SharedPreferences对象
[2].调用SharedPreferences中的edit()方法获取一个SharedPreferences.Editor对象
[3].向SharedPrefe添加的数据提交,完成数据存储操作rences.Editor对象中添加数据
[4].调用apply()方法将添加的数据提交,完成数据存储操作

(3)适用范围:
适用于保存键值对型数据

·(4)sharedPreference读取数据
sharedPreference读取数据非常的简单,实例化一个sharedPreference对象后,直接调用其中的getInt,getString等方法来读取相应类型的数据(类似上述添加数据的put方法),get默认值,所传入的键找不到对应类型的值时的默认值类方法接收两个参数,第一个是键,通过存储数据时使用的键来得到对应的值,第二个参数是默认值,所传入的键找不到对应类型的值时的默认值

###3.数据库存储
(1)方法介绍:
android内置了轻量级的关系型数据库SQLite数据库,开发者可直接借助SQLiteOpenHelper类对数据库进行创建和升级。
SQLiteOpenHelper中有两个构造函数可供重写,一般使用参数较少那个,这个构造方法接收四个参数,第一个是context,固定的,第二个是数据库名,第三个参数允许我们查询数据时返回一个自定义的Cursor,一般传入null,第四个参数表示当前数据库版本号,可用于数据库升级操作

在创建的帮助类中先定义我们的所要建的表,然后在onCreate()方法中调用SQLiteDatabase的execSQL()方法执行就完成了建库同时建表的操作

对于SQLiteOpenHelper实例中getWritableDatabase()方法和getReadableDatabase()方法的区别在于,当数据库不可写入时,getReadableDatabase()方法返回的对象将以只读形式去打开数据库,而getWritableDatabase()方法将出现异常

(2)操作流程:
创建一个帮助类继承抽象类SQLiteOpenHelper并重写oncreate()和onUpgrade()以及其中的构造方法,再之后构建出SQLiteOpenHelper实例后调用getReadableDatabase()或getWritableDatabase()方法就能创建数据库了,此时重写的onCreate()也会得到执行,再之后进行常规的数据库增删查改即可

(3)适用范围:
适用于存储大量复杂的关系型数据

·(4)adb工具:
由于所创建的数据库文件(db后缀)无法用File Explorer打开,为了确认我们建表成功,我们可以通过adb shell来对数据库和表的创建情况进行检查。

Adb工具是Android SDK自带的一个测试工具,使用该工具可直接对连接在电脑上的手机或模拟器进行调试,它存放在SDK的platform-tools目录下,想在命令行使用这个工具则要配置环境变量。

由于linux和mac使用者较少,这里仅讨论Windows系统,右击计算机-属性-高级系统设置-环境变量,然后找到Path,将其值改为platform-tools目录的完整路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pFXKFPOC-1587655884482)(https://img-blog.csdn.net/20170803214814935?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM4MjEzODU4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

然后打开命令行界面,输入adb shell进入控制台,再cd /data/data/com.example.工程名/databases进入到目录下,再ls查看目录文件,输入sqlite3 数据库名 进入到数据库,可以查看到该数据库下所建的表就确认了(此处非重点,不赘述)

·(5)升级数据库
当我们想对所建立的数据库内的表进行增加或是删除,上述所提到的onUpgrade()方法就起到了作用。以添加表为例,首先,在onCreate()方法中照葫芦画瓢,先在帮助类中定义所想添加的表的内容,并在onCreate()方法中一样调用execSQL()方法建表,由于所在数据库已经存在,onCreate()方法不会再次执行,那么我们就可以在onUpgrade()方法中用db调用execSQL()进行drop的删除原有表操作,然后再添加onCreate(db)重新调用上面的onCreate()方法实现数据库的更新。记得将前面的构造函数的第四个参数改为大于1的数让onUpgrade()方法得以执行哦

·(6)对数据库中的表的数据进行增删查改
四种操作大同小异,都是通过调用SQLiteDatabase中的方法(以实例db为例)实现,下面一一简单列举讲解(查询操作仅列最简单的一个)

  • 增(添加数据):
    db.insert(),接收三个参数,第一个参数表名,即目标表名,第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般用不到这个功能传null即可,第三个参数是一个ContentValues对象,它提供一系列put()方法重载用于向该对象添加数据,只需要将每个列名及相应待添加数据传入即可。
  • 删(删除数据):
    db.delete(),接收三个参数,第一个表名,第二第三个约束条件
  • 查(查询数据):
    db.query(),接收七个参数,第一个表名,第二个查询目标列名(不指定默认所有列),第三第四约束条件(不指定默认所有行),第五个参数是对查询结果以哪一列进行排列(group by对象),第六个参数是对group by后含有什么或值为什么进行进一步过滤(having),第七个参数是对最终结果进行排列的方式,以上三个不指定即默认不进行group by操作,having操作及默认的排序方式
  • 改(修改数据):
    db.update(),接收四个参数,第一个参数表名,第二个contentValues对象名,把更新的数据组装在这里,第三个第四个用于约束更新某一行或某几行中的数据,不指定则默认更新所有行。第三行第四行例如name=?,new String[]{“name的名字”},即可实现对name这一行的数据更改。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值