@第一行代码
数据持久化简介
- 数据持久化就是就将手机或是电脑中的临时数据(瞬时数据)保存到存储设备中,即使设备断电,或者关机的情况下,这些数据任然不会丢失.
文件
- 文件存储是数据持久化的最基本的一种数据存储方式,,他不对存储的内容进行任何格式化处理.所有的数据都是原封不动的保存到文件中,适合存储一些简单的文本数据和二进制数据.
- 文件读写
- write
-
img
- 首先根据Context类中的一个openFileOutput()方法,把要保存的的数据存到文件中,参数一是文件名,参数二是文件的操作模式
- 主要有两种操作模式,MODE_PRICATE 和 MODE_APPEND,
- 其中MODE_PRICATE 是默认的操作模式, 表示文件名存在的时候就会覆盖之前存储的数据
- MODE_APPEND 表示文件存在的时候就会,继续往该文件中追加内容
- openFileOutput()会返回一个FileOutputStream 对象,剩下的就是JAVA对流的操作将数据写到文件中
- 保存好的文件默认会保存在data/data/包名/files/目录中
- read
- img
SharedPreferences
不同于文件存储,SharedPreferences 保存的数据使用的键值对的形式.也就是说在保存一条数据的时候就要为这条数据添加一个Key,在获取这条数据的时候也是根据这个key来获取值,而且SharedPreferences 还支持不同的数据类型,保存为int类型,取出来的就是int类型,保存为String类型,取出来的时候就是Stirng类型
-
获取SharedPreferences 实例
- Context 类中的getSharedPreferences(),第一个参数是SharedPreferences的文件名,参数二是操作模式,目前只有MODE_PRICATE 这一种模式可选
- Activity类中的getPreferences(),只有一个参数,操作模式,获取的SharedPreferences文件名为当前活动的类名.
- PreferencesManager 类中的getDefaultSharedPreferences() ,这时一个静态方法,接收一个Context参数,并自动使用当前的包名前缀来命名SharedPreferences文件
-
在获取SharedPreferences 对象之后就可以向SharedPreferences 来提交数据了,提交数据一般有三个步骤
- 调用SharedPreferences 的Edit(),获取SharedPreferences.Editor对象
- 向SharedPrefercens.Editor 对象添加数据 edit.putString();
- 将数据提交 edit.apply();
-
ShreadPreferences 保存的文件默认会在data/data/包名/shared_prefs/目录下
SQLite
-
创建数据库
- 创建类集成SQLiteOpenHelper,重写onCreate()和onUpgrade()
- 构造方法的四个参数 ,参数一为Context,参数二为数据库名称,第三个参数为自定义的Cursor对象,在这里一般传入null,参数四为当前数据的版本,都是整数,一般开始都为1
- 在onCreate() 通过SQLiteDatabase 对象调用execSQL("这里传入建表的SQL语句")
- 在创建数据库的时候一般是通过获取SQLiteOpenHelper对象,然后掉用getReadableDatabse()就会执行创建数据库的操作
- 如果在创建数据库的时候检测到数据库已经存在就不会再执行创建数据库的操作
-
升级数据库
- 在升级数据在数据库的版本上要+1;当出现无法创建数据库的时候可以在onUpgrade()方法中执行
- 先将之前的数据库删掉; db.execSQL(" drop table id exists TBALE_NAME")
- 然后再次调用onCreate() 创建数据库
-
添加数据
- 在SQLite 中执行CRUD 的操作都是在SQLiteDatabase 对象的基础上操作的
- 添加是调用SQLiteDatabase 对象的 insert(),这里有三个参数
- 参数一是:表名,参数二是:在未指定添加数据情况下给某些可能为空的列自动赋值null,一般我们用不到,在这里一般传入NULL,参数三是ContentValue对象,他通过一系列重载的方法,可以传入不同类型的数据
-
更新数据
- SQLiteDatabase 对象调用update()
- 参数一:表名 参数二:ContentValue对象,参数三和参数四用于约束某一行或者某几行中的数据,不指定的话就是默认更新所有行
-
删除数据
- SQLiteDatabase 对象调用delete()
- 三个参数;参数一是表名,参数二和参数三还是用于约束
-
查询数据
- SQLiteDatabase 对象调用query() ,这个方法有最少的也是有七个参数
- 参数一: 固定不变还是表名
- 参数二: 查询列名
- 参数三: 约束条件
- 参数四: 占位符对应的值
- 参数五: 需要排序的列
- 参数六: 排序约束
- 参数七: 制定查询结果的排序
- 不指定参数默认查询所有数据
-
使用传统的SQL操作数据库
- 添加,删除,修改 execSQL("SQL")
- 查询 , rawQuery("SQL")
使用开源项目 LitePal
- LItePal简介
- LItePal 是一个开源的Android数据库框架,它采用的是对象关系映射(ORM)的模式,它将我们平时开发用到的一些常用功能进行了封装,不用编写一行SQL语句就可以完成建表和各种增删改查的操作.
- 配置LitePal
- 添加依赖 comple 'org.litepal.android:core:1.4.1'
- 在main文件夹下创建 asstes 文件夹, 并创建litepal.xml 文件夹
- img
- dbname 表示数据库的名称
- version 表示数据库版本
- list 表示用于指定所有的映射模型
- manifest.xml 配置application 节点 name属性值为 org.litepal.LitePalApplication
- 创建和升级数据库
- 创建一个Javabean 类,把这个类的完整类名添加到litepal.xml 中的lsit 标签中的 <mapping>
- 创建数据的时候只需要调用
LitePal.getDatabase();
就可已完成数据的创建. - 升级数据库 只需要修改两个地方
- 第一在litepal.xml 修改你的数据库版本号
- 第二,如果有新建的bean类,还需要把它的全名添加到litepal.xml 文件的list 标签中.
- 添加数据
- 添加数据的方法和在Java中对对象的操作是一样的
- 创建Bean 类对象
- 调用对象的set...()方法
- 在完成数据的添加之后调用对象save() 方法 就可以完成添加数据的操作
- 更新数据
- 对已经存储的对象操作
- 对与已经存在的对象进行操作 可以直接对象调用set方法,然后调用save()
- 如果当前对象是第一次创建的话可以使用 updateAll() 方法进行跟新数据,方法内的参数也是用于条件约束的,但是此方法不可以为参数设置默认值,如果为参数设置默认值,那么litepal 是不会对这个参数进行更新操作
- 对于想要设置默认参数的操作LitePal 提供了一个setToDefaule()方法 只要在方法内传入想要修改的字段名(列名)就可以
- 对已经存储的对象操作
- 删除数据
- 通过DataSupport.deleteAll()方法
- 第一个参数表示要删出哪一张表的的数据 ,参数的值类的字节码对象
- 后面两个参数表示指定的约束条件
- 查询数据
- 使用DataSupport.findAll(), 只需要输入要查询的类的字节码即可查询这个表中的所有数据
- 查询第一条 DataSupport.findFirst()
- 查询最后一条 DataSuppprt.findLast();
- 也可以使用连缀查询
- DataSupport.select("name","author").find(Book.class); 查询book表中name和author的这两列的数据
- DataSupport.where("pages>?", 100).fins("Book.class"); 查询book表中页数大于400的数据
- DataSupport.order("price desc").find("Book.class"); 查询Book表所有的数据,并按照书价从高到低排序
- DataSupport.limit(3).find("Book.class"); 查询表中的前三条数据
- DataSupport.limit(3).offset(1).find("Book.class");查询表中的2.3.4条数据 offset 用于设置偏移量
- DataSupport.select(""name,"price","pages").where("pages>?",100).order("pages").limit(10).offset(10).find("Book.class");这条徒具表示的是查询Book表中第10-20条满足pages大于100这个条件的name,price,pages三列的数据,并将最后的数据按照pages升序排列
网友评论