Android编程之SQLite数据库操作方法详解
本文实例讲述了android sqlite数据库操作方法。分享给大家供大家参考,具体如下:
sqlite and android
sqlite简介
sqlite是一个非常流行的嵌入式数据库,它支持sql语言,并且只利用很少的内存就有很好的性能。此外,它还是开源的,任何人都可以使用它。
sqlite由以下几个组件组成:sql编译器、内核、后端以及附件。sqlite通过利用虚拟机和虚拟数据库引擎(vdbe),使调试、修改和扩展sqlite的内核变得更加方便。
sqlite支持的数据类型包括:
1. text (类似于java的string)
2. integer (类似于java的long)
3. real (类似于java的double)
更多sqlite数据类型知识可以参考前面相关文章入:详解sqlite中的数据类型
sqlite in android
android在运行时集成了sqlite,因此在android中使用sqlite数据库并不需要安装过程和获取数据库使用权限,你只需要定义创建和更新数据库的语句即可,其他的会由android平台替你搞定。
操作sqlite数据库通常意味着操作文件系统,这种操作还是比较耗时的,因此建议将数据库操作异步执行。
你的应用创建一个sqlite数据库,数据在默认情况下,存储在/data/data/app_name/databases/filename。这里data是environment.getdatadirectory()方法返回的值,app_name是你的应用包名
android开发中使用sqlite数据库
activity可以使用content provider或者 service访问一个数据库。
创建数据库
android不自动提供数据库。在android应用程序中使用sqlite,必须自己创建数据库,然后创建表、索引、填充数据。android提供了一个sqliteopenhelper帮助你创建一个数据库,你只要继承 sqliteopenhelper 类,就可以轻松的创建数据库。
sqliteopenhelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。sqliteopenhelper 的子类,至少需要实现三个方法:
构造函数,调用父类sqliteopenhelper的构造函数。这个方法需要四个参数:上下文环境,数据库名字,一个可选的游标工厂(通常是null),一个代表你正在使用的数据库模型版本的整数。
oncreate()方法,它需要一个sqlitedatabase对象作为参数,根据需要对这个对象填充表和初始化数据。
onupgrade()方法,它需要三个参数,一个sqlitedatabase对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变为新的模型。
首先,定义需要创建的表结构,使用类来进行抽象,这里示例定义一个新浪微薄的帐号类:
public class accounttable { public static final string table_name = "account_table"; public static final string uid = "uid"; public static final string username = "username"; public static final string usernick = "usernick"; public static final string avatar_url = "avatar_url"; public static final string portrait = "portrait"; public static final string oauth_token = "oauth_token"; public static final string oauth_token_secret = "oauth_token_secret"; public static final string infojson = "json"; }
下面代码展示了如何继承sqliteopenhelper创建数据库,推荐使用单例类:
import android.content.context; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqliteopenhelper; import org.qii.weiciyuan.support.database.table.*; class databasehelper extends sqliteopenhelper { private static databasehelper singleton = null; private static final string database_name = "weibo.db"; private static final int database_version = 16; static final string create_account_table_sql = "create table " + accounttable.table_name + "(" + accounttable.uid + " integer primary key autoincrement," + accounttable.oauth_token + " text," + accounttable.oauth_token_secret + " text," + accounttable.portrait + " text," + accounttable.username + " text," + accounttable.usernick + " text," + accounttable.avatar_url + " text," + accounttable.infojson + " text" + ");"; databasehelper(context context) { super(context, database_name, null, database_version); } @override public void oncreate(sqlitedatabase db) { db.execsql(create_account_table_sql); } @override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { switch (oldversion) { default: deletealltable(db); oncreate(db); } } public static synchronized databasehelper getinstance() { if (singleton == null) { singleton = new databasehelper(globalcontext.getinstance()); } return singleton; } private void deletealltable(sqlitedatabase db) { db.execsql("drop table if exists " + accounttable.table_name); } }
增删改查数据库
因为sqlite支持标准的sql语句,因此我们可以用标准sql语句才增删改查数据库,推荐使用占位符的sql语句,看起来更加清爽,下面是我的代码示例:
package com.hw.droid.hwcatalog; public class databasemanager { private static databasemanager singleton = null; private sqlitedatabase wsd = null; private sqlitedatabase rsd = null; private databasemanager() { } public static databasemanager getinstance(context context) { if (singleton == null) { synchronized (databasemanager.class) { if (singleton == null) { databasehelper databasehelper = databasehelper.getinstance(context); singleton = new databasemanager(); singleton.wsd = databasehelper.getwritabledatabase(); singleton.rsd = databasehelper.getreadabledatabase(); } } } return singleton; } public void initaccounttable(list<accountdata> listdatas) { if (listdatas == null || listdatas.size() <= 0) { return; } wsd.begintransaction(); try { for (accountdata data : listdatas) { insertaccounttable(data); } wsd.settransactionsuccessful(); } finally { wsd.endtransaction(); } } private void insertaccounttable(accountdata accdata) { string sql = "insert into " + accounttable.table_name + "(" + accounttable.username + ", " + accounttable.usernick + ", " + accounttable.avatar_url + ", " + accounttable.portrait + ", " + accounttable.oauth_token + ", " + accounttable.oauth_token_secret + ", " + accounttable.infojson + " " + ")" + " values(?, ?, ?, ?, ?, ?, ?)"; wsd.execsql(sql, new object[] { accdata.getusername(), accdata.getusernick(), accdata.geturl(), accdata.getport(), accdata.gettoken(), accdata.getsecret(), accdata.getjson(), accdata.getthreads(), }); } public list<accountdata> getaccountdatas() { list<accountdata> listdatas = selectaccountdata(); return listdatas; } private list<accountdata> selectaccountdata() { list<accountdata> listaccountdata = new arraylist<accountdata>(); string querysql = "select " + accounttable.username + ", " + accounttable.usernick + ", " + accounttable.avatar_url + ", " + accounttable.portrait + ", " + accounttable.oauth_token + ", " + accounttable.oauth_token_secret + ", " + accounttable.infojson " " + " from " + bbsforumstable.table_name; cursor cursor = rsd.rawquery(querysql, null); if (cursor.movetofirst()) { do { accountdata data = new accountdata(); data.setusername(cursor.getstring(cursor.getcolumnindex(accounttable.username))); data.setusernick(cursor.getstring(cursor.getcolumnindex(accounttable.usernick))); data.seturl(cursor.getstring(cursor.getcolumnindex(accounttable.avatar_url))); data.setport(cursor.getstring(cursor.getcolumnindex(accounttable.portrait))); data.settoken(cursor.getstring(cursor.getcolumnindex(accounttable.oauth_token))); data.setsecret(cursor.getstring(cursor.getcolumnindex(accounttable.oauth_token_secret))); data.setjson(cursor.getstring(cursor.getcolumnindex(accounttable.infojson))); listaccountdata.add(data); } while (cursor.movetonext()); } cursor.close(); return listaccountdata; } public void deletebbsdatas() { string delsql = "delete from " + accounttable.table_name; wsd.execsql(delsql); } }
事物(dbtransaction)
android中经常会用到数据库缓存,特别是wifi情况下遇到数据不一致情况需要更新缓存数据,这个时候就需要用到事物处理,保证操作的完整性和速度。android中使用sqlite保证事务完整性示例如下:
public void initaccounttable(list<accountdata> listdatas) { if (listdatas == null || listdatas.size() <= 0) { return; } wsd.begintransaction(); try { for (accountdata data : listdatas) { insertaccounttable(data); } wsd.settransactionsuccessful(); } finally { wsd.endtransaction(); } }
通过begintransaction()开启事务,endtransaction()结束事务,并且设置事务执行成功标识settransactionsuccessful().
更多关于android相关内容感兴趣的读者可查看本站专题:《android操作sqlite数据库技巧总结》、《android数据库操作技巧总结》、《android编程之activity操作技巧总结》、《android文件操作技巧汇总》、《android开发入门与进阶教程》、《android资源操作技巧汇总》、《android视图view技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
上一篇: linux查看实时日志命令(查看日志的三种命令分享)
下一篇: 一个简单的Android定时任务