数据持久化:将内存中的瞬时数据存储到设备中

1.  文件存储

存储一些简单的文本数据或二进制数据。

核心:Context类提供的openFileOutput()和openFileInput()方法,然后再用Java的各种流进行读写操作。、

1)         写数据到文件

Step1:FileOutputStream out = openFileOutput("data", Context.MODE_PRIVATE);

// openFileOutput()可用于将数据存储到指定文件中,文件默认存储路径为/data/data/<packagename>/files/目录下。第一个参数是文件名,第二个参数是操作模式。该方法返回一个FileOutputStream对象,FileOutputStream类用来创建一个文件并向文件中写数据,如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。

Step2BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));                //使用OutputStreamWriter构建BufferedWriter对象

Step3writer.write(inputText);     //将文本写入文件

提示:查看数据通过View > Tool Windows > Device File Explorer

2)         从文件中读数据

Step1FileInputStream in = openFileInput("data");

Step2BufferedReader reader = new BufferedReader(new InputStreamWriter(in));

Step3String 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学习_数据持久化的更多相关文章

  1. Android中的数据持久化机制

    Android中几种最简单但是却最通用的数据持久化技术:SharedPreference.实例状态Bundle和本地文件. Android的非确定性Activity和应用程序生存期使在会话间保留UI状 ...

  2. iOS学习之数据持久化详解

    前言 持久存储是一种非易失性存储,在重启设备时也不会丢失数据.Cocoa框架提供了几种数据持久化机制: 1)属性列表: 2)对象归档: 3)iOS的嵌入式关系数据库SQLite3: 4)Core Da ...

  3. Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

    一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/fi ...

  4. 【Android学习】数据传递三种方式

    1.Application 注意在清单文件中的Application节点下注册android:name属性, 继承Application类,重写onCreate方法, 使用数据时,实例化自定义类时需要 ...

  5. android(9)_数据存储和访问3_scard基本介绍

    使用Activity的openFileOutput()保存文件的方法,文件存储在手机空间,通常情况下,手机的存储空间不是很大,存储小文件确定.假设你要存储大文件,如视频,是不可行. 对于这样大的文件, ...

  6. Android学习_广播接收器

    一.广播 1. 标准广播和有序广播 标准广播:异步,发出消息,所有接收器同时接收.但无法被截断 有序广播:同步,同一时刻只有一个广播接收器接收.可截断消息. 2. 广播注册 代码中注册(动态注册).A ...

  7. Python学习_数据排序方法

    Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2, ...

  8. Android学习_注意事项

    一. Fragment中加载ListView public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle ...

  9. Android学习_服务

    一.           服务1.         Android多线程 每一个Android应用程序都会分别运行在一个独立的Dalvik(或ART?)虚拟机中,而每个虚拟机在启动时会运行一个UI主线 ...

随机推荐

  1. 题解luoguP2054 BZOJ1965【[AHOI2005]洗牌】

    题目链接: https://www.luogu.org/problemnew/show/P2054 https://www.lydsy.com/JudgeOnline/problem.php?id=1 ...

  2. mqtt协议实现 java服务端推送功能(一)安装

    最近有个新需求,需要通过java服务端把信息推送到mqtt服务器上,安卓和ios端从mqtt服务器上获取信息实现推送. 1. 本地需要安装Mosquitto服务器  http://mosquitto. ...

  3. java代码实现图片内容转文字

    前言 现在的手机已经可以实现拍照转文字了.作为一名程序员,得使用java代码实现这一功能,虽然可能没啥用!!! pom.xml 添加依赖 <dependency> <groupId& ...

  4. javaScript基础题

    1.介绍JavaScript的基本数据类型 Number.Boolean.String.underfind.null Object是JavaScript中所有对象的父对象 数据封装类对象:Object ...

  5. C# 使用Quartz.Net

    //首先在Nuget上下载 Quartz包 但是由于我睿智Nuget 怎么也没法用 于是找到了这个 解决方法: 1.点击右侧的设置按钮, 2.弹出窗中左侧树形结构选择“程序包源”,再点击右上方的添加按 ...

  6. 实现单点登录功能的思路以及kafka同步数据

    单点登录以及用户数据同步思路与方案 当公司业务分布于多个子系统时, 同一用户在A系统注册,即可在其他所有关联系统使用, 并支持登录A系统后,自动在其他系统登录,退出同理. 在A平台修改通用的用户数据( ...

  7. 08-【jsp重点】

    jsp的四个作用域和9个内置对象 jsp内置对象[重点]:pageContext.request.session.application.response.out.page.exception.con ...

  8. leetcode第6题:Z字形变换--直接模拟求解法

    [题目描述] 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: 之后,你 ...

  9. 线上MYSQL同步报错故障处理总结(转)

    前言 在发生故障切换后,经常遇到的问题就是同步报错,数据库很小的时候,dump完再导入很简单就处理好了,但线上的数据库都150G-200G,如果用单纯的这种方法,成本太高,故经过一段时间的摸索,总结了 ...

  10. 批量删除Zen Cart 无图片商品

    <?php /** * * @ 批量删除Zen Cart 无图片商品 * @ 使用方法: 将本文件上传到网站根目录下运行 http://你的域名/zcdelpro.php * @ $status ...