第六章 数据存储全方案-详解持久化技术

文件存储

不适合保存一些复杂的数据,解析不方便

1. 将数据存储到文件中

context.openFileOutPut(fileName,MODE_PRIVATE/MODE_APPEND)

可以拿到一个文件输出流,然后操作,MODE_PRIVATE表示新写入的内容会覆盖旧的内容,MODE_APPEND表示会添加到后面。

注意:文件名不能包括路径,默认存储在data/data/包名/files/目录下

2. 从文件中读取数据

context.openFileInPut(fileName)

注意:同上

SharedPrefernces

  • 目录:data/data/包名/shared_prefs/…
  • Activity中有一个getPreferences(),会以类名为文件名返回一个对象
  • context.getSharePreferences()
  • PreferenceManager.getDefaultSharedPreferences()静态方法,以包名为前缀命名文件

SQLite数据库存储

  • 当数据库不可写入的时候(例如磁盘已满),getReadableDatabase()返回的对象将以只读的形式去打开数据库,而getWritableDatabase()则抛出异常
  • 存放位置data/data/包名/databases/...
  • 数据类型
    • integer 整形
    • real 浮点型
    • text 文本
    • blob 布尔
  • primart key 主键
  • autoincrement 自增长
  • 第一次调用getXXXXDatabase()的时候检测到没有数据库,就会调用helper类的onCreate()方法
  • 数据库目录下有“两个”文件
    • xxx.db 就是我们创建的数据库文件
    • xxx.db-journal 为了让数据库支持事务操作,产生的临时文件
  • 命令
    • sqlite3 xxx.db 就可以进入某一个数据库了
    • .table 查看已有的表
    • .schema 查看建表语句
  • 更新数据库的表

    • onCreate方法只有在创建数据库(xx.db)的时候才会执行,所以不能直接在onCreate中执行
    • 在onUpgrade中执行,先把存在的表删除,然后重新执行创建
    db.execSQL('drop table if exists XXX(表名)'); 
    onCreate(db);
    • 需要更新构造方法中的版本号,比上一个大就ok
query()方法参数对应的SQL部分
tablefrom table_name
columnsselect column1,column2
selectionwhere column = value
selectionArgswhere column = value
groupBygroup by column
havinghaving column = value
orderByorder by column1,column2

使用LitePal操作数据库

  1. build.gradle中引入laitePal的地址
  2. app/src/main下创建asset->litepal.xml
<?xml version="1.0" encoding="utf-8"?>
<LitePal>
    <dbname value="表名"></dbname>

    <version value="1"></version>

    <list>
      <mapping class="com.xk.test.litepal.User"></mapping>
    </list>
</LitePal>
  1. 清单文件中配置application为org.litepal.LitePalApplication
  2. 对bean进行表管理的时候无所谓,如果要进行增删改查,需要继承DataSupport

    • 更新数据
    • 最简单的更新已存在的,直接save即可,那么什么是已存在的呢?
      • model.save();之后
      • 通过查询获取到的model
    • 上一中方法只能对已存储的更新,限制大还可以这样做
      • Model model=new Model(); //... model.updateAll(String... 条件);
      • model.updateAll("name = ? and author = ?","名字","作者");
    • ==注意==

      • java中的数据类型都有默认值,例如int的默认值是0
      • 如果创建一个User,setName,但是不setAge,这样age依旧是0,LitePal认为没有设置age,所以就不更新age
      • 那么创建一个User,setAge(0),跟默认值大小一样,所以LitePal依旧认为没有设置age,所以也不会更新,这种情况下可以这样写:book.setToDefault("age");
      • int 默认值0     boolean默认值false
    • 删除数据

    • model.delete(); 也是针对已存在的数据,这个已存在在上面已经说过了
    • DataSupprot.deleteAll(Model.class,”price <”,”15”);//不指定条件代表要删除所有数据
    • 查询数据
    • 查询所有List<Model> models=DataSupport.findAll(Model.class);
    • Model model=DataSupport.findFirst(Model.class);
    • Model model=DataSupport.findLast(Model.class);
    • 更多查询
      • 利用select查询指定列DataSupport.select(“列名1”,”列名2”).find(Model.class);
      • 利用where查询DataSupport.where(“pages >”,”15”).find(Model.class);
      • DataSupport.order(“pages desc”).find(Model.class);//排序 desc=降序 asc/不写=升序
      • DataSupport.limit(3).find(Model.class);//前三条数据
      • DataSupport.limit(3).offset(1).find(Model.class);//查询三条数据,偏移1,所以结果是第二三四条数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值