SQLite是Android内嵌的一个数据库,用于存储大量的数据,其特点是轻量级,占用内存很少,不需要安装,多有的数据都包含在一个文件中,多个平台只需拷贝数据库文件就可直接使用,默认只能本应用访问,app卸载时会一同被卸载。
存储路径:/data/data/包名/databases/xx.db
SQLite管理工具:可视化的数据库管理工具,推荐SQLite Expert Professional,
下载地址:http://www.sqliteexpert.com
主键:_id integer primary key autoincrement 表示设置_id为主键并自增
数据库类型
NULL: 这个值为空值
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。
CHAR(n):长度固定为n的字串,n不能超过 254。
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。
BINARY:用于保存图片,对应字节数组byte[]
DATA :包含了 年份、月份、日期。
TIME: 包含了 小时、分钟、秒
SQLiteDatabase
SQLiteDatabase代表一个数据库对象,数据库的核心类之一,针对数据操作的主要类,主要对数据库的表的创建,增删改查等动作,其方法:
SQLiteDatabase除了本身的insert,update,delete等操作语句,还有两个同样可以进行数据的操作。
executeSQL(String sql, Object[] bindArgs);// 执行语句的增删改,并不是用于查询
rawQuery(String sql, String[] selectionArgs);查询语句,返回Cursor对象
常用增删改查语句
创建表:db.execSQL("create table wdply(_id integer primary key autoincrement,name varchar ,age int,sex varchat,tel varchar)");
增:db.execSQL("insert into wdply values(null,?,?,?,?)", newObject[]{"小明",1,"男","159"});
删:db.execSQL("delete from wdply where name=?", newObject[]{"小明"});
改:db.execSQL("update wdply set sex=? where name=?", newObject[]{"女","小明"});
查:Cursor cursor = db.rawQuery("select * from wdply", null);
Cursor对象
查询语句时,返回cursor对象,用于读取查询到的数据,cursor对象常用的方法:
SQLiteOpenHelper
是抽象类,子类必须继承SQLiteOpenHelper,并实现其连个抽象方法:
onUpgrade(SQLiteDatabasedb, int oldVersion, int newVersion)
SQLiteDatabase会自动检测数据库文件是否存在,如果数据库存在,会打开这个数据库,在这种情况下并不会执行onCreate()方法,如果数据库文件不存在,则会创建一个数据库,并打开这个数据库,最后执行onCreate方法,因此,onCreate方法一般用来在新创建的数据库中建立表,视图等数据库组件,也就是说onCreate方法在数据库第一次创建的时候调用。
数据库创建会有一个初始化版本为1,数据库升级时需增大这个版本号,这是SQLiteDatabase会调用OnUpgrade方法,调用完后系统会更新数据库版本号,因此在OnUpdate方法中一般先删除要升级的表,视图等,然后在创建他们。
总结:如果数据库文件不存在,只有onCreate方法被调用,(该方法只会被调用一次),如果数据库文件存在,并且当前版本较高,执行onUpgrade方法更新数据库,并更新版本号。
SQLiteOpenHelper的getReadableDatabase() 和 getWritableDatabase()区别
Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。(getReadableDatabase()方法中会调用getWritableDatabase()方法)
其中getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase()方法就会出错。
getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象