一、Android中的数据库
1、 使用SQLiteOpenHelper对数据库进行版本管理
在android系统中,为我们提供了一个名为SqLiteOpenHelper的抽象类,必须继承它才可以使用。
为了实现数据库的版本管理,Sqliteopenhelper类提供了二个重要方法
oncreate:用于初次使用软件时生成数据库表
onUpgrade:用于升级软件时更新数据库表结构
当调用SqliteOpenHelper的getWritAbleDatabase或者getReadableDatabse方法获取操作数据库的SqliteDatabase实例时候,如果数据库不存在,安卓系统会自动生成一个数据库,接着调用oncreate方法,oncreate方法在初次生成数据库时才会被调用。
在oncreate方法中,创建表,初始化数据。
在onUpgrade方法中,数据库版本发生变化时会被调用,一般软件升级时才需要修改版本号。
注意:发现好多博客文章,只是说明在数据库升级时,把需要改变的表结构操作放在 onUpgrade中,个人感觉这种说法有些错误。
查看源码可以发现:
try
{
if (version == 0) {
onCreate(db);
}
else {
if (version > mNewVersion) {
onDowngrade(db, version,
mNewVersion);
}
else {
onUpgrade(db, version,
mNewVersion);
}
}
db.setVersion(
mNewVersion);
db.setTransactionSuccessful();
}
finally {
db. endTransaction();
}
只有在首次创建数据库时才走, onCreate方法,但是不走 onUpgrade方法。作为新安装的客户端的app来说,在 onUpgrade做的升级改变数据表的的代码是不走的。所有个人认为,在sqlite数据库版本升级时,需要升级的部分也需要在 onCreate方法中调用。这样既可兼容之前版本的升级,也可以使新的版本包含升级的内容。
2、
同: 都可以获取一个用于操作数据库的SQLiteDatabase实例
异:getWritableDatabase打开读写数据库,一旦数据库内存不足,只能打开只能读不能写的数据库, 倘若使用getWritableDatabase()打开数据库就会出错。
getReadableDatabase 方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
注意:getWritableDatabase(),getReadableDatabase的区别是当数据库写满时,调用前者会报错,调用后者不会,所以如果不是更新数据库的话,最好调用后者来获得数据库连接。
3、数据库的 CRUD相信大家已经很熟悉了,这里就不详细描述
二、 SharedPreferences
与Sqlite数据库相比,免去创建数据库表,写sql的众多操作,相对操作方便,但是缺陷,只能存储boolean,int,float,long和String,五种简单数据类型,不能条件查询。
SharedPreferences接口主要负责读取应用程序的Preferences数据,它提供了如下常用方法来访问SharedPreferences的key_value键值对。
1、 SharedPreferences常用的属性和方法
contains 判断 SharedPreferences是否包含特定的key
edit 返回一个Edit对象用于操作SharedPreferences
getAll 获取SharedPreferences数据里全部的key-valu
getXXX(String key,XXX defvlaue) 获取SharedPreferences数据指定key所对应的value,如果该key不存在,返回默认值defValue。其中XXX可以是boolean、float、int、long、String等基本类型的值
SharedPreferences是一个接口,在接口里没有提供写入数据的能力。但是内部有个editor内部的接口,edit这个接口有一系列的方法用于操作sharepreference。
2、Editor接口的常用方法
clear 清空SharedPreferences里所有的数据
commit 当Editor编辑完成后,调用该方法可以提交修改,而且必须要调用这个数据才修改
putXXX (String key, boolean XXX) 向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值
remove (String key) 删除SharedPreferences里指定key对应的数据项
3、SharedPreferences实例化
SharedPreferences是一个接口,程序是无法创建SharedPreferences实例的,可以通过Context.getSharedPreferences(String name,int mode)来得到一个SharedPreferences实例
name:是指文件名称,不需要加后缀.xml,系统会自动为我们添加上。一般这个文件存储在/data/data/<package name>/shared_prefs下(这个面试常问到)
mode:是指定读写方式,其值有三种,分别为:
Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写
Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写
Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写。
三、文件存储
(1)内部存储(手机存储)
原理:提供二个方法打开数据文件里的文件IO流
FileInputStream openFileInput(String name); 用于指定文件名 读
FileOutputStream(String name , int mode) 第二个参数指定打开文件的模式 写
打开文件模式:
MODE_PRIVATE:默认模式,代表该文件私有数据,在改模式下,写入的内容会覆盖原文件内容。
MODE_APPEND:该模式会检测文件是否存在,存在就追加内容,否则就创建新的文件。
MODE_WORLD_READABLE:可以被其他应用读取。
MODE_WORLD_WRITEABLE:可以被其他应用写入
其他方法:
getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录
File getFilesDir():获取该应用程序的数据文件夹得绝对路径
String[] fileList():返回该应用数据文件夹的全部文件
openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.tony.app/files/message.txt,
(2)外部存储(sd卡存储)
存储目录为sd卡下的目录
四、使用ContentProvider存储数据:安卓四大组件之一
五、网络存储数据