Android编程操作嵌入式关系型SQLite数据库实例详解
本文实例分析了android编程操作嵌入式关系型sqlite数据库的方法。分享给大家供大家参考,具体如下:
sqlite特点
1.android平台中嵌入了一个关系型数据库sqlite,和其他数据库不同的是sqlite存储数据时不区分类型
例如一个字段声明为integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数。
除非是主键被定义为integer,这时只能存储64位整数
2.创建数据库的表时可以不指定数据类型,例如:
3.sqlite支持大部分标准sql语句,增删改查语句都是通用的,分页查询语句和mysql相同
select * fromperson limit 20 offset 10 select * fromperson limit 20,10
创建数据库
1.定义类继承sqliteopenhelper
2.声明构造函数,4个参数
3.重写oncreate()方法
4. 重写upgrade()方法
示例:
package cn.itcast.sqlite; import android.content.context; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqliteopenhelper; import android.database.sqlite.sqlitedatabase.cursorfactory; public class dbopenhelper extends sqliteopenhelper { /** * 创建openhelper * @param context 上下文 * @param name 数据库名 * @param factory 游标工厂 * @param version 数据库版本, 不要设置为0, 如果为0则会每次都创建数据库 */ public dbopenhelper(context context, string name, cursorfactory factory, int version) { super(context, name, factory, version); } /** * 当数据库第一次创建的时候被调用 */ public void oncreate(sqlitedatabase db) { db.execsql("create table person(id integer primary key autoincrement, name)"); } /** * 当数据库版本发生改变的时候被调用 */ public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { db.execsql("alter table person add balance"); } } public void testcreatedb() { dbopenhelper helper = new dbopenhelper(getcontext(), "itcast.db", null, 2); helper.getwritabledatabase(); // 创建数据库 }
crud操作
1.和jdbc访问数据库不同,操作sqlite数据库无需加载驱动,不用获取连接,直接可以使用
获取sqlitedatabase对象之后通过该对象直接可以执行sql语句:
sqlitedatabase.execsql() sqlitedatabase.rawquery()
2.getreadabledatabase()和getwritabledatabase()的区别
查看源代码后我们发现getreadabledatabase()在通常情况下返回的就是getwritabledatabase()拿到的数据库只有在抛出异常的时候才会以只读方式打开
3.数据库对象缓存
getwritabledatabase()方法最后会使用一个成员变量记住这个数据库对象,下次打开时判断是否重用
4.sqlitedatabase封装了insert()、delete()、update()、query()四个方法也可以对数据库进行操作
这些方法封装了部分sql语句,通过参数进行拼接
执行crud操作有两种方式,第一种方式自己写sql语句执行操作,第二种方式是使用sqlitedatabase类调用响应的方法执行操作
execsql()方法可以执行insert、delete、update和createtable之类有更改行为的sql语句; rawquery()方法用于执行select语句。
第一种方式示例:
package cn.itcast.sqlite.service; import java.util.arraylist; import java.util.list; import android.content.context; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import cn.itcast.sqlite.dbopenhelper; import cn.itcast.sqlite.domain.person; public class sqlpersonservice { private dbopenhelper helper; public sqlpersonservice(context context) { helper = new dbopenhelper(context, "itcast.db", null, 2);//初始化数据库 } /** * 插入一个person * @param p 要插入的person */ public void insert(person p) { sqlitedatabase db = helper.getwritabledatabase(); //获取到数据库 db.execsql("insert into person(name,phone,balance) values(?,?)", new object[] { p.getname(), p.getphone() }); db.close(); } /** * 根据id删除 * @param id 要删除的person的id */ public void delete(integer id) { sqlitedatabase db = helper.getwritabledatabase(); db.execsql("delete from person where id=?", new object[] { id }); db.close(); } /** * 更新person * @param p 要更新的person */ public void update(person p) { sqlitedatabase db = helper.getwritabledatabase(); db.execsql("update person set name=?,phone=?,balance=? where id=?", new object[] { p.getname(), p.getphone(), p.getbalance(), p.getid() }); db.close(); } /** * 根据id查找 * @param id 要查的id * @return 对应的对象, 如果未找到返回null */ public person find(integer id) { sqlitedatabase db = helper.getreadabledatabase(); cursor cursor = db.rawquery("select name,phone,balance from person where id=?", new string[] { id.tostring() }); person p = null; if (cursor.movetonext()) { string name = cursor.getstring(cursor.getcolumnindex("name")); string phone = cursor.getstring(1); integer balance = cursor.getint(2); p = new person(id, name, phone, balance); } cursor.close(); db.close(); return p; } /** * 查询所有person对象 * @return person对象集合, 如未找到, 返回一个size()为0的list */ public list<person> findall() { sqlitedatabase db = helper.getreadabledatabase(); cursor cursor = db.rawquery("select id,name,phone,balance from person", null); list<person> persons = new arraylist<person>(); while (cursor.movetonext()) { integer id = cursor.getint(0); string name = cursor.getstring(1); string phone = cursor.getstring(2); integer balance = cursor.getint(3); persons.add(new person(id, name, phone, balance)); } cursor.close(); db.close(); return persons; } /** * 查询某一页数据 * @param page 页码 * @param size 每页记录数 * @return */ public list<person> findpage(int page, int size) { sqlitedatabase db = helper.getreadabledatabase(); cursor cursor = db.rawquery("select id,name,phone,balance from person limit ?,?" // , new string[] { string.valueof((page - 1) * size), string.valueof(size) }); list<person> persons = new arraylist<person>(); while (cursor.movetonext()) { integer id = cursor.getint(0); string name = cursor.getstring(1); string phone = cursor.getstring(2); integer balance = cursor.getint(3); persons.add(new person(id, name, phone, balance)); } cursor.close(); db.close(); return persons; } /** * 获取记录数 * @return 记录数 */ public int getcount() { sqlitedatabase db = helper.getreadabledatabase(); cursor cursor = db.rawquery("select count(*) from person", null); cursor.movetonext(); return cursor.getint(0); } }
第二种方式示例:
/** * 插入一个person * @param p 要插入的person */ public void insert(person p) { sqlitedatabase db = helper.getwritabledatabase(); contentvalues values = new contentvalues(); values.put("name", p.getname()); values.put("phone", p.getphone()); values.put("balance", p.getbalance()); // 第一个参数是表名, 第二个参数是如果要插入一条空记录时指定的某一列的名字, 第三个参数是数据 db.insert("person", null, values); db.close(); } /** * 根据id删除 * @param id 要删除的person的id */ public void delete(integer id) { sqlitedatabase db = helper.getwritabledatabase(); db.delete("person", "id=?", new string[] { id.tostring() }); db.close(); } /** * 更新person * @param p 要更新的person */ public void update(person p) { sqlitedatabase db = helper.getwritabledatabase(); contentvalues values = new contentvalues(); values.put("id", p.getid()); values.put("name", p.getname()); values.put("phone", p.getphone()); values.put("balance", p.getbalance()); db.update("person", values, "id=?", new string[] { p.getid().tostring() }); db.close(); } /** * 根据id查找 * @param id 要查的id * @return 对应的对象, 如果未找到返回null */ public person find(integer id) { sqlitedatabase db = helper.getreadabledatabase(); cursor cursor = db.query("person", new string[] { "name", "phone", "balance" }, "id=?", new string[] { id.tostring() }, null, null, null); person p = null; if (cursor.movetonext()) { string name = cursor.getstring(cursor.getcolumnindex("name")); string phone = cursor.getstring(1); integer balance = cursor.getint(2); p = new person(id, name, phone, balance); } cursor.close(); db.close(); return p; } /** * 查询所有person对象 * @return person对象集合, 如未找到, 返回一个size()为0的list */ public list<person> findall() { sqlitedatabase db = helper.getreadabledatabase(); cursor cursor = db.query("person", new string[] { "id", "name", "phone", "balance" }, null, null, null, null, "id desc"); list<person> persons = new arraylist<person>(); while (cursor.movetonext()) { integer id = cursor.getint(0); string name = cursor.getstring(1); string phone = cursor.getstring(2); integer balance = cursor.getint(3); persons.add(new person(id, name, phone, balance)); } cursor.close(); db.close(); return persons; } /** * 查询某一页数据 * @param page 页码 * @param size 每页记录数 * @return */ public list<person> findpage(int page, int size) { sqlitedatabase db = helper.getreadabledatabase(); cursor cursor = db.query( // "person", new string[] { "id", "name", "phone", "balance" }, null, null, null, null, null, (page - 1) * size + "," + size); list<person> persons = new arraylist<person>(); while (cursor.movetonext()) { integer id = cursor.getint(0); string name = cursor.getstring(1); string phone = cursor.getstring(2); integer balance = cursor.getint(3); persons.add(new person(id, name, phone, balance)); } cursor.close(); db.close(); return persons; } /** * 获取记录数 * @return 记录数 */ public int getcount() { sqlitedatabase db = helper.getreadabledatabase(); cursor cursor = db.query( // "person", new string[] { "count(*)" }, null, null, null, null, null); cursor.movetonext(); return cursor.getint(0); }
事务管理
1.使用在sqlite数据库时可以使用sqlitedatabase类中定义的相关方法控制事务
begintransaction() 开启事务
settransactionsuccessful() 设置事务成功标记
endtransaction() 结束事务
2.endtransaction()需要放在finally中执行,否则事务只有到超时的时候才自动结束,会降低数据库并发效率
示例:
public void remit(int from, int to, int amount) { sqlitedatabase db = helper.getwritabledatabase(); // 开启事务 try { db.begintransaction(); db.execsql("update person set balance=balance-? where id=?", new object[] { amount, from }); system.out.println(1 / 0); db.execsql("update person set balance=balance+? where id=?", new object[] { amount, to }); // 设置事务标记 db.settransactionsuccessful(); } finally { // 结束事务 db.endtransaction(); } db.close(); }
希望本文所述对大家android程序设计有所帮助。