《第一行代码》笔记6—数据存储

主要内容:
\diamond 1.向文件存储数据
\diamond 2.从文件读取数据
\diamond 3.用SharedPregerences存储
\diamond 4.从SharedPregerences读取数据
\diamond 5.SQLite数据库相关内容
\diamond 6.LitePal相关内容

0.Android中的持久化技术

数据持久化:将内存中的瞬时数据保存到存储设备中,存储在存储设备中的数据就拥有了持久状态。

三种数据持久化方式:文件存储SharedPreference存储数据库存储(这三种方式比起保存在SD卡中更简单、更安全)


1.文件存储数据

  • 特点:
    \circ 比较适合存储简单的文本数据二进制数据,因为不对存储内容进行任何格式化处理,数据原封不动地保存到文件中
    \circ (复杂的文本数据需要定义一套自己的格式规范以便之后复杂文本的解析)

  • 主要方法:Context类中的openFileOutput方法
    \circ 方法中的两个参数: 文件名(不包含路径)、文件的操作模式MODE_PRIVATEMODE_APPEND)
    MODE_PRIVATE:默认操作模式,覆盖原文件
    MODE_APPEND:追加到原文件后

  • 返回: FileOutputStream对象

  • 存储路径: /data/data/<packagename>/files/


2. 从文件中读取数据

  • 主要方法:Context类中的openFileInput方法
    \circ **方法中的 1 个参数: 文件名(不包含路径)

  • 返回: FileInputStream对象

  • 存储路径: /data/data/<packagename>/files/

得到FileInputStream对象之后就可以通过Java流的方式将数据读取出来


3.SharedPregerences存储数据

用键值对的方式存储数据
支持多种不同的存储类型

  • 获取SharedPreferences对象的三种方法:

    \heartsuit Context类中的 getPreference()方法
    两个参数:文件名和操作模式(只有MODE_PRIVATE,也可以直接传入0,表示只有当前应用程序才可以对SharedPreference文件进行读写,其它均已被废弃)

    \heartsuit Activity类中的getPreference()方法
    只有1个参数:操作模式,文件名为当前活动的类名

    \heartsuit PreferenceManager类中的getDefaultPreferences()方法
    静态方法,接收一个Context参数,且自动使用当前应用程序包名作为前缀来命名SharedPreference文件

实现三步曲:
(1)获取SharedPreferences.Editor对象
SharedPreferences.Editor editor=SharedPreferences("filename","oprate mode").edit()
(2)向SharedPreferences.Editor对象中添加数据,用putBoolean()putString()等方法
(3)调用apply()方法将添加的数据提交

存储路径: /data/data/<packagename>/shared_prefs/


4. 从SharedPreference中读取数据

SharedPreferences对象中的getBoolean("key","defaultvalue")方法进行读取


相关代码请看→这里←


其它:

在Android Studio 3.4.1出现了无法访问文件目录的情况,这里使用adb shell来修改权限↓↓↓

\triangleright adb shell的使用:
首先在系统变量种添加adb.exe的路径:
找到sdk路径下的platform-tools路径,将该路径添加到环境变量的path变量中

接着在cmd命令窗口就可以使用adb shell命令了:

上图中第二个箭头所指的位置需要做说明:
如果sdk在22时,出现的提示就和上图一样,虚拟机直接已经有了root权限,并且可以直接执行给data/data等目录添加权限的操作;如果sdk是26,要先通过su命令获取虚拟机的root权限,如果是目前的sdk28,则不能通过su命令获取root权限

5.SQLite数据库相关内容

【目录】

  1. SQLite数据库简介
  2. SQLite数据库的使用
    (1). 创建数据库
    (2). 升级数据库
    (3). 添加数据
    (4). 更新数据
    (5). 删除数据
    (6). 查询数据
    (7). 用SQL语句直接操作数据


0616更新

1. SQLite数据库简介

SQLite是一款轻量级的关系型数据库,可以存储大量复杂的关系型数据;运算速度非常快,占用内存通常只需要几百KB;支持标准SQL语法和ACID事务。

ACID事务,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易双方的要求。


2. SQLite数据库的使用

1. 创建数据库

存放路径:/data/data/<package name>/databases/

1). 抽象类SQLiteOpenHelper主要内容:

  • 两个抽象方法:onCreate() 用来初次创建表时使用,onUpgrade升级数据库时使用
  • 两个实例方法:getWritableDatabase()用来向数据库写数据,getReadableDatabase()用来从数据库读数据,返回一个SQLiteDatabase对象

2). 创建数据库的具体操作

  • 得到实现了SQLiteOpenHelper的类MyDatabaseHelper的实例,并得到一个SQLiteDatabase对象,表示打开或成功创建了数据库BookStore.db

  • MyDatabaseHelper中只需要写如下语句:

3). 用Android SDK中自带的调试工具:adb查看创建的数据库和表

路径:sdk的platform-tools目录

Windows中adb的使用方法和具体步骤:
1.添加环境变量到path
2.进入控制台(命令adb shell)
3.进入到数据库所在目录下(data/data/com.example.databasetest/databases)用ls命令查看该目录下具有的文件
4.用sqlite3 **.db命令打开对应的数据库,用.table命令查看其中有哪些表(其中android_metadata表是每个数据库中都会生成的),用.schema命令查看建表语句
过程中遇到的问题:
①遇到了Permission denied相关错误,参考这里的方法,把模拟器版本将到6.0及以下就可以了;
②退出...>的方法:输入"[空格];",空格和分号,该方法来自这里

2. 升级数据库

  • 需要将版本号变为比原来版本号大的数
  • 再在MyDatabaseHelper中写成如下形式:

3. 添加数据

出现过的小问题: adb中为什么select * from Book之后要先退出...>状态才能显示出表内数据?这是因为sql语句后要加;才完整

4. 更新数据

5. 删除数据

6. 查询数据

7. 用SQL语句直接操作表中数据

相关代码在这里


20190714更新

5.LitePal相关内容

1. 简介

LitePal是一个开源库,是一款开源Android数据库框架,采用了对象关系映射(ORM)的模式,并将一些数据库功能进行了封装,不用编写一行SQL语句就可以完成各种简表和增删改查的操作。
该项目的开源代码地址:
https://github.com/LitePalFramework/LitePal

2. 配置LitePal

  1. 在app/build.gradle中声明开源库的引用:
dependencies{
    ...
   implementation 'org.litepal.android:java:3.0.0'
    ... 
}
  1. 在main下新建assets目录,在该目录下新建litepal.xml文件,手动填写扩展名,内容为:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
      <dbname value="BookStore"></dbname>
      <version value="1"></version>
      <list></list>
</litepal>

dbname是数据库名,version是数据库版本号,list指定所有映射类型

  1. 在AndroidManifest.xml文件中配置LitePalApplication
<application
      ...
      android:name=""org.litepal.LitePalApplication"
      ...
>
      ...
</application>

3. 创建和升级数据库BookStore.db

创建数据库:

  1. 首先定义一个Book表的实体类,继承LitePalSupport类
  1. 将Book类添加到对象关系映射模型列表中,在litepal.xml文件的list标签中配置如下代码:
<list>
        <mapping class="com.example.test.datastoragedemo.beans.Book"></mapping>
</list>
  1. 调用Connector.getDatabase();方法自动创建数据库

数据库BookStore.db的路径:data/data/databases/,和SQLite创建数据的路径相同

升级数据库:
只需要在创建的基础上更改内容即可,如向Book类中添加字段或再创建一个表等。

4. 使用LitePal添加数据

实例化一个Book对象,用set方法添加各属性,最后用从LitePalSupport继承来的save方法完成添加操作。

5. 使用LitePal更新数据

两种方法,一种是重新用book对象调用set方法设置要更改的属性,再调用save方法;另一种是用set方法重新设置属性值后,调用updateAll()方法,在updateAll()方法中添加限定条件,如下:

6. 使用LitePal删除数据

两种方法,第一种是调用已存储对象的delete方法,在此之前先查询数据库中存在的条目;第二种是用LitePal调用deleteAll方法,如下:

7. 使用LitePal查询数据

查询部分功能相对复杂,主要分为对整张表的操作和限定各种条件的操作,各种限定操作的组合连缀功能可以免去之前query方法的一长串参数;LitePal还可以调用原生的SQL语句来执行更复杂的操作

相关代码看这里


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容