Android数据存储之SQLite使用
sqlite是一款开源的、嵌入式关系型数据库,第一个版本alpha发布于2000年。sqlite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。
在android中创建的sqlite数据库存储在:/data/data/<包名>/databases/目录下。
主要特点:
-轻量级
-独立性,没有不依赖,无需安装
-跨平台,支持众多操作系统
-支持高达2tb大小的数据库
-每个数据库以单个文件的形式存在
-以b-tree的数据结构形式存储在硬盘
sqlite的数据类型:
sqlite支持null、integer、real、text和blob数据类型
分别代表:空值、整型值、浮点值、字符串值、二进制对象。
动态数据类型(弱引用):
当某个值插入到数据库中时,sqlite将会检测它的数据类型,如果该类型与关联的列不匹配,sqlite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。
在android中使用sqlite主要涉及两个类:
sqlitedatabase和sqliteopenhelper,下面对这两个类进行主要的分析。
sqlitedatabase
这个类提供了一些管理sqlite数据库的方法,比如创建、删除、执行sql命令,和执行其他常见的数据库管理任务的方法。每个程序的数据库名字是唯一的。
常用方法:
db.execsql(string sql) //执行任何的sql语句
db.insert(string table,string nullcolumnhack,contentvalues values) //插入记录
db.delete(string table,string whereclause,string[] whereargs)//删除记录
db.update(string table,contentvalues values,string whereclause,string[] whereargs)//更新记录
db.query(string table,string[] columns,string selection,string[] selectionargs,string groupby,string having,string orderby)//查询记录
db.rawquery(string sql,string[] selectionargs)//通过sql语句查询记录
下面是一个简单操作sqlite数据库的示例:
public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //每个程序都有自己的数据库 //通过openorcreatedatabase来打开或创建一个数据库,返回sqlitedatabase对象 /** * openorcreatedatabase(string name,int mode,sqlitedatabase.cursorfactory factory) * name: 数据库名 * mode: 数据库权限,mode_private为本应用程序私有,mode_world_readable和mode_world_writeable分别为全局可读和可写。 * factory: 可以用来实例化一个cusor对象的工厂类 */ sqlitedatabase db = openorcreatedatabase("user.db",mode_private,null); //创建一个表 db.execsql("create table if not exists usertb (" + "_id integer primary key," + "name text not null,age integer not null," + "sex text not null)"); //向表中插入记录 db.execsql("insert into usertb (name,age,sex) values ('张三',18,'女')"); db.execsql("insert into usertb (name,age,sex) values ('李四',19,'男')"); db.execsql("insert into usertb (name,age,sex) values ('王五',20,'女')"); //cursor为查询结果对象,类似于jdbc中的resultset cursor queryresult = db.rawquery("select * from usertb", null); if (queryresult != null) { while (queryresult.movetonext()) { log.i("info", "id: " + queryresult.getint(queryresult.getcolumnindex("_id")) + " 姓名: " + queryresult.getstring(queryresult.getcolumnindex("name")) + " 年龄: " + queryresult.getint(queryresult.getcolumnindex("age")) + " 性别: " + queryresult.getstring(queryresult.getcolumnindex("sex"))); } //关闭游标对象 queryresult.close(); } //关闭数据库 db.close(); } }
当执行完openorcreatedatabase("user.db",mode_private,null)后,会在/data/data/<包名>/databases/目录下创建一个数据库文件,打开ddms可以查看。也可以将其导出,使用navigate等工具打开查看里面的数据。
另外,上述示例对记录的操作是使用execsql()方法通过原生的sql语句进行的,当然也可以使用上面介绍的sqlitedatabase常用的方法来操作,如insert()、delete()、update()、query()等方法。但是需要注意的是,以插入记录举例,当数据量不大时,通过execsql()使用sql语句进行插入与使用insert()方法插入记录的效率是差不多的,但是如果数据量比较大,那么使用前者比使用后者的效率明显高出很多。
sqliteopenhelper
这个类为sqlitedatabase的帮助类,主要用于管理数据库的创建与版本更新。sqlitehelper是一个抽象类,一般通过创建一个继承自它的子类并重写oncreat()和onupgrade()方法进行使用。
-oncreat(sqlitedatabase db) //首次创建数据库时调用,一般用于建表等操作。
-onupgrade(sqlitedatabase db,int oldversion,int newversion)//当升级数据库版本时调用
下面是使用sqliteopenhelper的一个简单示例:
创建一个继承自sqliteopenhelper的子类
public class sqlitehelper extends sqliteopenhelper { /** * context:上下文对象 * name:数据库名 */ public sqlitehelper(context context, string name) { super(context, name, null, 1); } //首次创建数据库的时候调用,一般进行建表或某些初始化的操作 @override public void oncreate(sqlitedatabase db) { //建表 db.execsql("create table if not exists usertb (" + "_id integer primary key," + "name text not null,age integer not null," + "sex text not null)"); } //当数据库版本升级时自动调用 @override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { } }
然后就可以通过sqlitehelper的实例获取一个sqlitedatabase对象,进而对数据库进行一系列的操作了。
public class mainactivity2 extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main2); //创建一个sqlitehelper对象 sqlitehelper helper = new sqlitehelper(mainactivity2.this,"stu.db"); //使用getwritabledatabase()或getreadabledatabase()方法获得sqlitedatabase对象 sqlitedatabase db = helper.getwritabledatabase(); //插入记录 db.execsql("insert into usertb (name,age,sex) values ('张三',18,'女')"); db.execsql("insert into usertb (name,age,sex) values ('李四',19,'男')"); db.execsql("insert into usertb (name,age,sex) values ('王五',20,'女')"); //获取游标对象 cursor queryresult = db.rawquery("select * from usertb", null); if (queryresult != null) { //打印所有记录 while (queryresult.movetonext()) { log.i("info", "id: " + queryresult.getint(queryresult.getcolumnindex("_id")) + " 姓名: " + queryresult.getstring(queryresult.getcolumnindex("name")) + " 年龄: " + queryresult.getint(queryresult.getcolumnindex("age")) + " 性别: " + queryresult.getstring(queryresult.getcolumnindex("sex"))); } //关闭游标对象 queryresult.close(); } //关闭数据库 db.close(); } }
推荐阅读