1.File文件存储git
在Android中写入和读取文件的方法,和 Java中实现I/O的程序是同样的,Context类中提供了openFileInput()和openFileOutput()方法来打开数据文件里的文件IO流。下面直接经过一个demo学习Android如何经过文件来保存数据。github
(1)写入数据shell
新建布局mylayout.xml,只加入一个EditText用于输入文本内容:数据库
新建MyActivity,在onCreate()获取EditText实例,而后重写onDestory()为了在活动销毁以前将输入的文本内容存储起来。具体方法是:先获取了EditText中输入的文本text,而后openFileOutput()方法将text存储到名为data的文件中而且可以获得一个FileOutputStream 对象,,再借助它构建出一 个OutputStreamWriter对象,接着再使用OutputStreamWriter 构建出一个 BufferedWriter 对象,这样就能够经过BufferedWriter来将文本内容写入到文件中了。bash
关键方法:app
FileOutputStream fileOutputStream = openFileOutput("data", Context.MODE_PRIVATE);
bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
bufferedWriter.write(text);
复制代码
这里强调openFileOutput()方法里第两个参数,表示是文件的操做模式,经常使用的可选值含义见下图:框架
运行程序,在输入框里输入Hello AS!而后退出程序。ide
查看DDMS,果真有data文件!导出后内容和输入彻底一致,证明了内容确实成功保存到文件了。函数
(2)读取数据工具
接下来咱们想让程序再次启动时输入框内已经显示刚刚写入的数据。在OnCreate()中用* openFileInput()* 方法指定了要从文件data中读取数据,以后代码和写入是对应的很是好理解。读取到内容以后判断是否为空,若不为空,就set到EditText里,并调用setSelection 方法将输入光标移动到文本的末尾位置以便于继续输入,再弹出一句从新加载成功的提示。
关键方法:
FileInputStream fileInputStream=openFileInput("data");
bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String line;
while((line=bufferedReader.readLine())!=null){
content.append(line);
}
复制代码
运行程序,效果如图:
2.SharePreferences存储
SharePreferences是一种轻型的数据存储方式,经常使用来存储一些简单的配置信息,如int、string、boolean、float和long。它的本质是基于XML文件存储key-value键值对数据。
实现SharedPreferences存储的步骤以下: (1)调用 getSharedPreferences() 方法得到SharedPreferences对象,提供两个参数,指定文件名和操做模式。 (2)调用SharedPreference对象的 edit() 方法得到SharedPreferences.Editor引用对象 (3)调用Edit接口的形如 put某某某() 方法以键值对形式保存 某某某 类型的数据 (4)调用Edit接口的 commit() 方法提交键值对。 必定注意,不用SharedPreferences对象去存储或修改数据,而是经过Editor对象。但获取数据时须要调用SharedPreferences对象的 get某某某() 方法了。
学习完SharePreferences基本知识点后,经过一个有记住密码功能的demo来巩固一下吧!新建login.xml,这里作一个登录界面,以下图所示。相信这样的一个页面难不倒你,布局嵌套就能实现了。
在MainActvity的onCreate()里先获取除了TextView的全部控件、实例化SharedPreferences和SharedPreferences.Editor、给两个按钮都注册击事件,代码以下:
再来看看点击事件,当点击cancel时,直接finish()结束当前活动;当点击login时,第一轮判断用户名和密码是否对应(假设只有一个帐户),若是不对应就弹出提示登录不成功,若是对应就提示登录成功并跳转到另外一个页面,在跳转以前要进行第二轮判断以保证数据不丢失,判断CheckBox是否选中,若是未选中就用Edit清除全部数据,若是选中就添加用户名和密码,注意最后必定要commit提交。
下两个图就是跳转页面的布局和活动了。
最后再回到MainActivity的onCreate()方法中,下面这段代码的含义是:当用户选中复选框而且成功登录一次以后,那么MyPres文件里确定有数据了,这时若是重启登录界面,SharedPreferences就会获取文件中数据而且呈如今输入框里了;当没有数听说明第一次打开界面或者用户不须要记住密码功能就什么也不须要显示了。
运行程序,测试一下:
而且记住密码功能也能很好的实现,这里就不展现了。若是用户选中复选框那么MyPres文件里就有数据了,见下图:
3.SQLite数据库存储
SQLite是一款轻量级的关系型数据库,它的运算速度很是快,占用资源不多,在存储大量复杂的关系型数据的时可使用,比前面学过的只适用于存储简单数据的两种存储方式要好不少。接下来学习如何建立、升级数据库以及对数据进行增删改查,并穿插一个完整的例子更好的掌握这些知识点。
(1)建立数据库
先学习一个类SQLiteOpenHelper,它是SQLiteDatabase的帮助类, 用于管理数据库的建立和升级。SQLiteOpenHelper的使用步骤:
第一步:自定义帮助类并继承SQLiteOpenHelper,并重写两个方法:**onCreate()**和 onUpgrade(),分别在这两个方法中去实现建立、升级数据库的逻辑。还须要一个构造方法,这里用含有四个参数的构造方法就能够,如图:
第二步:建立数据库时,先实例化一个自定义的帮助类,并提供四个参数,含义是(上下文,数据库名,建立Cursor的工厂类,版本号)。 第三步:用帮助类对象的 getReadableDatabase() 和 getWritableDatabase() 去建立或打开一个现有的数据库(若是数据库已存在则直接打开,不然建立一个新的数据库),并返回一个可对数据库 SQLiteDatabase 。 第四步:以后就能够利用获得的数据库进行增删改查的操做了。
下面就来作个demo吧!从自定义帮助类开始,并重写两个方法及构造函数。在这里用帮助类帮助建立一个student表,包含学生的学号、姓名、年龄和年级,对应的SQL语句就放在一个字符串常量里。特别要注意语句必定要准确,多个空格都会建表失败。在onCreate()方法里会返回一个SQLiteDatabase对象,接下来终于接触到SQLiteDatabase的第一个经常使用方法execSQL(),这个方法很是万能,它可接受和处理SQL语句,换句话说,后面将要学习的增删改查不只能够用提供好的现成的辅助性方法,还可直接用原生SQL语句再调用execSQL()就够了,在后面的学习中只介绍前一种方法。这里就调用execSQL()去建立表并打印一行提示的Toast。一个自定义帮助类构建好了!
而后新建布局,并放入五个按钮,对应建立和增删改查:
在主活动里获取全部按钮实例并注册点击事件,在onCreate()实例化帮助类MyHelper,指定数据库名为student.db,版本号为1。ContentValues类先跳过。
接下来实现点击建立按钮的效果:调用getReadableDatabase()建立数据库,且MyHelper的onCreate()也会执行,那么student表也被创建了。
运行程序,点击建立有Toast提示!但这不表明student表创建成功。因此到DDMS下找文件,确实有student.db数据库,但想要查看它须要别的工具,因此换一种查看方式,用adb shell来检查,命令以下:
能够证明student表成功创建了!
(2)增长数据
如今学习以前看到的ContentValues类,经常使用它 put() 方法以键值对的形式存储基本类型数据。在增和改会用到它,能够理解为键就是表中属性名,值就是表中数据。还经常使用方法 clear() 清空全部数据。
再来学习SQLiteDatabase用于增添数据的辅助性方法 insert() ,三个参数含义(被操做的表名,空值字段的名称,数据即ContentValues对象),第二个参数通常传入null。学会以后给student表插入两行记录吧,由于id这个属性设置了自增加因此能够不用管它:
运行程序,数据确实插入成功!
(3)删除数据
删除数据的辅助性方法是delete(),第一个参数仍是表示表名,第二第三个参数用于约束删除某一行或几行的数据。好比须要删除student表中年龄大于17的记录:
运行,发现表中第二条记录果真被删除了!
(4)更改数据
update() 方法提供四个参数,(表名,ContentValues对象,约束,约束),以前都学过了!来试试给表里惟一的学生Lucy的年级更改成高三:
更改为功!
(5)查询数据
查询方法 quary() 复杂一些,须要至少七个参数(table, columns, selection, selectionArgs, groupBy, having, orderBy),含义是:(表名,要查询出的列名,查询条件子句,对应于selection语句中占位符的值,要分组的列名,分组后过滤条件,排序方式)。其实也不用惧怕,多数状况下少数几个参数就能完成查询操做了。
还没完,这个方法会返回一个Cursor,查询到的数据都会从它取出。Cursor经常使用方法: moveToFirst() 将指针移动到结果集的第一行; getColumnIndex() 获取某一列在表中对应位置的索引; get某某某() 传入索引以获取相应位置的某种类型的数据; close() 关闭指针。下面来查询student表中全部数据:
打印出的日志结果如图:
(6)升级数据库
MyHelper里须要重写的第二个方法 onUpdate() 用于帮助数据库进行版本更新。好比此刻须要在数据库再添加一张表course,只要在update()写好建立course的操做,而后想办法让它被调用就行了。还记得在实例化帮助类是须要传入的第四个参数版本号吗?以前的传入的是1,只要传入一个比1大的数就可让update()执行了。在下图代码里利用了 oldVersion 去判断旧版本号,若是是1就只须要再建course表,若是初次运行程序,就只会执行onCreate()方法而后两张表就一块儿创建了。这样作的好处是不管更新到第几代都不会影响以前的操做数据,也能保证当前版本是最新的。
修改版本号为2:
从新运行程序,点击建立,student表不会再建立而只会建立course表!
补充阅读:Litepal是一个轻型的数据库操做框架,采用了对象关系映射的模式,并对经常使用的数据库操做进行了封装,使用它会方便不少。感兴趣可见:项目主页,使用方法.
数据持久化技术就学习到这里~
> 下一篇预告:组件篇之ContentProvider