Android学习_数据持久化
数据持久化:将内存中的瞬时数据存储到设备中
1. 文件存储
存储一些简单的文本数据或二进制数据。
核心:Context类提供的openFileOutput()和openFileInput()方法,然后再用Java的各种流进行读写操作。、
1) 写数据到文件
Step1:FileOutputStream out = openFileOutput("data", Context.MODE_PRIVATE);
// openFileOutput()可用于将数据存储到指定文件中,文件默认存储路径为/data/data/<packagename>/files/目录下。第一个参数是文件名,第二个参数是操作模式。该方法返回一个FileOutputStream对象,FileOutputStream类用来创建一个文件并向文件中写数据,如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
Step2:BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); //使用OutputStreamWriter构建BufferedWriter对象
Step3:writer.write(inputText); //将文本写入文件
提示:查看数据通过View > Tool Windows > Device File Explorer
2) 从文件中读数据
Step1:FileInputStream in = openFileInput("data");
Step2:BufferedReader reader = new BufferedReader(new InputStreamWriter(in));
Step3:String line = “”;
while((line = reder.readLine() != null)){
content.apped(line);
}
2. SharedPreferences存储
使用键值对存储数据,支持不同数据类型,更简单方便,应用场景更多。
SharedPreferences文件都是存放在/data/data/<package name>/shared_prefs/目录下,并且是XML格式。
核心:使用SharePreferences对象和SharedPreferences.Editor对象
1) 写数据到SharedPreferences
Step1:获取SharedPreferences对象:
方法一:Context类的getSharedPreferences()方法,第一个参数指定文件名,如果指定的文件不存在就创建一个;第二个参数是操作模式(只有MODE_PRIVETE一种且为默认的,表示只有当前应用程序才可以对这个SharedPreferences进行读写操作)。
方法二:Activity类的getPreferences()方法,只接收操作参数,该方法自动将当前活动的类名作为SharedPreferences的文件名。
方法三:PreferenceManager类的getDefaultSharedPreferences()方法,接收一个Context参数,自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。
Step2:调用SharedPreferences对象的editor()方法获取SharedPreferences.Editor对象。
Step3:调用SharedPreferences.Editor对象的一系列put方法(如:putString(“name”,”Tom”)),方法第一个参数是键。
Step4:调用SharedPreferences.Editor对象的apply()方法将添加的数据提交。
2) 从SharedPreferences中读数据
Step1:使用getSharedPreferences()方法获取SharedPreferences对象。
Step2:调用SharedPreferences对象的一系列get方法(如getString(“neme”,””)),第一个参数是键;第二个参数是默认值,表示当传入的键找不到时返回什么样的默认值。
3. SQLite数据库存储
1) 创建数据库
Step1:继承SQLiteOpenHelper抽象类,重写onCreat()和onUpgrate()方法。onCreate(SQLiteDatebase db)方法处理一些创建表的逻辑,即调用SQLiteDatebase的execSQL(CREATE_BOOK)方法执行建表语句:
create table Book(
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text)
Step2:构建SQLiteOpenHelper的实例:new MyDatabaseHelper(this, “BookStore.db”, null, 1);
(SQLiteOpenHelper的常用构造方法有四个参数:参数一为Context;参数二为数据库名(String);参数三表示允许查询数据时返回一个自定义Cursor,一般都传入null;参数四为当前数据库的版本号(int))
Step3:调用SQLiteOpenHelper的实例的getReadableDatabase()或getWriteabeDatabase()方法,此时onCreate()和onUpgrate()会执行。这两种方法都可以创建或打开数据库(创建的数据库会存放在/data/data/<package name>/databases/ 目录下),不同之处在于当数据库不可写入时,getReadableDatabase()
返回的对象将以只读的方式打开数据库,而getWriteabeDatabase()将出现异常。
2) 升级数据库
Step1:在onUpgrade()方法中添加DROP语句:
public volid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL(“drop table if exists Book”);
db.execSQL(“drop table if exists Category”);
onCreate(ab);
}
发现数据库中存在已有表格就将其删除。
Step2:构建SQLiteOpenHelper的实例:new MyDatabaseHelper(this, “BookStore.db”, null, 2); 版本号传入比1大的数。
3) 添加数据
CRUD(Create,Retrieve,Update,Delete)。调用getReadableDatabase()或getWriteabeDatabase()方法会返回一个SQLiteDatabase对象,借助该对象进行CRUD操作。
Step1:获取SQLiteDatabase对象
Step2:创建ContentValues对象
Step3:使用ContentValues对象的put方法添加数据
Step4:调用SQLiteDatabase对象的insert()方法
4) 增(insert)
CRUD(Create,Retrieve,Update,Delete)。调用getReadableDatabase()或getWriteabeDatabase()方法会返回一个SQLiteDatabase对象,借助该对象进行CRUD操作。
Step1:使用getReadableDatabase()或getWriteabeDatabase()获取SQLiteDatabase对象。
Step2:创建ContentValues对象(ContentValues是一种数据存储机制,且只能存储基本类型的数据)。
Step3:使用ContentValues对象的put方法对要添加数据进行组装。
Step4:调用SQLiteDatabase对象的insert(“Book”, null , values)方法插入一条数据。该方法第一个参数是表名;第二参数一般填null;第三个参数就是前面的ContenValues对象。
5) 改(update)
前三步与添加数据相同。
Step4:调用SQLiteDatabase对象的update (“Book”, values, “name = ?”, new String[] {“The Da Vinci Code”})修改数据。该方法第三、第四个参数用于约束更新某一行或某几行的数据,不指定就默认更新所有行。
6) 删(delete)
Step1:使用getReadableDatabase()或getWriteabeDatabase()获取SQLiteDatabase对象。
Step2:调用SQLiteDatabase对象的delete(“Book”, “pages > ?”, new String[] {“500”} )方法删除数据。该方法第二、第三个参数用于约束删除某一行或某几行的数据,不指定就默认删除所有行。
7) 查(query)
Step1:使用getReadableDatabase()或getWriteabeDatabase()获取SQLiteDatabase对象。
Step2:调用SQLiteDatabase对象的qury()方法查询数据,返回一个Cursor对象。
query()方法用于对数据进行查询,最短的七个参数:
|
Query()方法参数 |
对应SQL部分 |
描述 |
|
Table |
from table_name |
指定查询的表名 |
|
Columns |
Select colummn1,column2 |
指定查询列名 |
|
Selection |
Where column = value |
指定where的约束条件 |
|
selectionArgs |
为where中的占位符提供更具体的值 |
|
|
groupBy |
Group by column |
指定需要group by的列 |
|
having |
Having column= value |
对group by后的结果进一步约束 |
|
orderBy |
Order by column1,column2 |
指定查询结果的排序方式 |
Step3:使用Cursor对象的moveToFirst()将数据的指针移到第一行,然后进入循环中使用Cursor对象的一系列get方法读取数据:String name = cursor.getString(cursor.getColumnIndex(“name”));
Cursor对象的getColumnIndex()方法获取某一列在表中对应的位置索引,在通过这个索引读取数据。
8) 使用SQL操作数据库
查询操作调用SQLiteDatebase的rawQuery()方法,其他操作都调用execSQL()方法。
Android学习_数据持久化的更多相关文章
- Android中的数据持久化机制
Android中几种最简单但是却最通用的数据持久化技术:SharedPreference.实例状态Bundle和本地文件. Android的非确定性Activity和应用程序生存期使在会话间保留UI状 ...
- iOS学习之数据持久化详解
前言 持久存储是一种非易失性存储,在重启设备时也不会丢失数据.Cocoa框架提供了几种数据持久化机制: 1)属性列表: 2)对象归档: 3)iOS的嵌入式关系数据库SQLite3: 4)Core Da ...
- Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制
一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/fi ...
- 【Android学习】数据传递三种方式
1.Application 注意在清单文件中的Application节点下注册android:name属性, 继承Application类,重写onCreate方法, 使用数据时,实例化自定义类时需要 ...
- android(9)_数据存储和访问3_scard基本介绍
使用Activity的openFileOutput()保存文件的方法,文件存储在手机空间,通常情况下,手机的存储空间不是很大,存储小文件确定.假设你要存储大文件,如视频,是不可行. 对于这样大的文件, ...
- Android学习_广播接收器
一.广播 1. 标准广播和有序广播 标准广播:异步,发出消息,所有接收器同时接收.但无法被截断 有序广播:同步,同一时刻只有一个广播接收器接收.可截断消息. 2. 广播注册 代码中注册(动态注册).A ...
- Python学习_数据排序方法
Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2, ...
- Android学习_注意事项
一. Fragment中加载ListView public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle ...
- Android学习_服务
一. 服务1. Android多线程 每一个Android应用程序都会分别运行在一个独立的Dalvik(或ART?)虚拟机中,而每个虚拟机在启动时会运行一个UI主线 ...
随机推荐
- 富文本二进制转换成string
].KindExplain); ) { explainString = explainString.Substring(, explainString.IndexOf() + , explainStr ...
- C#面向对象19 值传递和引用传递
值类型:int double char decimal bool enum struct引用类型:string 数组 自定义类 集合 object 接口 **值传递和引用传递1.值类型在复制的时候,传 ...
- 服务端相关知识学习(四)之Zookeeper启动过程
在上一篇,我们了解了zookeeper最基本的配置,也从中了解一些配置的作用,那么这篇文章中,我们将介绍Zookeeper的启动过程,我们在了解启动过程的时候还要回过头看看上一篇中各个配置参数在启动时 ...
- ython实现进程间的通信有Queue,Pipe,Value+Array等,其中Queue实现多个进程间的通信,而Pipe实现两个进程间通信,而Value+Array使用得是共享内存映射文件的方式,所以速度比较快
1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #添加数据函数 def proc_write(qu ...
- vue入门:(模板语法与指令)
vuejs使用及HTML的模板语法,可以实现声明式将DOM绑定至底层VUE实例的数据.通过模板语法将数据渲染进DOM的系统,结合响应系统,在应用状态改变时,Vue能够计算出重新渲染组件的最小代价并应用 ...
- python 语言
认识程序 程序时根据语言提供的指令按照一定的逻辑顺序对获得的数据进行运算,并最终返回给我们的指令和数据的组合. 低级语言有时叫机器语言或者汇编语言,在我们看来是一串0和1组成的二进制数字,这些数字代表 ...
- mint-ui下拉加载(demo实例)
<template> <div class="share"> <div class="header"> <div cl ...
- MySql学习笔记【四、数据相关操作】
CURD--增改查删 创建数据 INSERT [INTO] tb_name [(col_name,...)] VALUES(val,..) 若列名缺省,表示插入全部列,也可指定部分列名 如: INSE ...
- LVS (Linux虚拟服务器)-不同的负载均衡方法
随着Internet用户的增长,基于Web的公司处理的通信量急剧增加.有各种解决方案来应对这种不断增长的流量. 一种解决方案是垂直扩展服务器(即:简单地向服务器添加更多的CPU和内存资源.)当然在一定 ...
- Linux计划任务与压缩归档
计划任务分为两种形式 第一种:定时性的:也就是例行,每隔一定的周期就要重复来做这个任务. 第二种:突发性的:临时决定,只执行一次的任务. 用到的命令有两个 at:它是一个可以处理仅执行一次的任务就结束 ...