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程序设计有所帮助。

时间: 2024-10-24 22:31:52

Android编程之SQLite数据库操作方法详解的相关文章

Android编程之json解析实例详解_Android

本文实例分析了Android编程之json解析的方法.分享给大家供大家参考,具体如下: JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. – Json.org JSON Vs XML 1.JSON和XML的数据可读性基本相同 2.JSON和XML同样拥有丰富的解析手段 3.

Android编程之SurfaceView学习示例详解_Android

本文实例讲述了Android编程之SurfaceView学习示例.分享给大家供大家参考,具体如下: SurfaceView是View的子类,使用的方式与任何View所派生的类都是完全相同的,可以像其他View那样应用动画,并把它们放到布局中. SurfaceView封装的Surface支持使用本章前面所描述的所有标准Canvas方法进行绘图,同时也支持完全的OpenGL ES库. 使用OpenGL,你可以再Surface上绘制任何支持的2D或者3D对象,与在2D画布上模拟相同的效果相比,这种方法

Android编程之SurfaceView学习示例详解

本文实例讲述了Android编程之SurfaceView学习示例.分享给大家供大家参考,具体如下: SurfaceView是View的子类,使用的方式与任何View所派生的类都是完全相同的,可以像其他View那样应用动画,并把它们放到布局中. SurfaceView封装的Surface支持使用本章前面所描述的所有标准Canvas方法进行绘图,同时也支持完全的OpenGL ES库. 使用OpenGL,你可以再Surface上绘制任何支持的2D或者3D对象,与在2D画布上模拟相同的效果相比,这种方法

iOS开发:多线程编程之NSThread的使用详解

  1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用) 3.GCD 全称:Grand Central Dispatch( iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用) 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的. 这篇我们主要介绍和使用NSThr

Android编程操作嵌入式关系型SQLite数据库实例详解_Android

本文实例分析了Android编程操作嵌入式关系型SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite特点 1.Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型 例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数. 除非是主键被定义为Integer,这时只能存储64位整数 2.创建数据库的表时可以不指定数据类型,例如: 复制代码 代码如下: CREATE TAB

Android编程操作嵌入式关系型SQLite数据库实例详解

本文实例分析了Android编程操作嵌入式关系型SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite特点 1.Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型 例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数. 除非是主键被定义为Integer,这时只能存储64位整数 2.创建数据库的表时可以不指定数据类型,例如: 复制代码 代码如下:CREATE TABL

iOS中SQLite数据库使用详解

使用SQLite数据库 创建数据库 创建数据库过程需要3个步骤: 1.使用sqlite3_open函数打开数据库: 2.使用sqlite3_exec函数执行Create Table语句,创建数据库表: 3.使用sqlite3_close函数释放资源. 这个过程中使用了3个SQLite3函数,它们都是纯C语言函数,通过Objective-C去调用C函数当然不是什么问题,但是也要注意Objective-C数据类型与C数据类型兼容性问题. 下面我们使用SQLite技术实现备忘录案例,与属性列表文件实现

Zend Framework入门教程之Zend_Db数据库操作详解

本文实例讲述了Zend Framework中Zend_Db数据库操作方法.分享给大家供大家参考,具体如下: 引言:Zend操作数据库通过Zend_Db_Adapter 它可以连接多种数据库,可以是DB2数据库.MySQli数据库.Oracle数据库.等等. 只需要配置相应的参数就可以了. 下面通过案例来展示一下其连接数据库的过程. 连接mysql数据库 代码: <?php require_once 'Zend/Db.php'; $params = array('host'=>'127.0.0.

SQLite数据库约束详解

一.约束 Constraints 在SQLite数据库中存储数据的时候,有一些数据有明显的约束条件. 比如一所学校关于教师的数据表,其中的字段列可能有如下约束: 年龄 - 至少大于20岁.如果你想录入一个小于20岁的教师,系统会报错. 国籍 - 默认中国.所谓默认,就是如果你不填写,系统自动填上默认值. 姓名 - 不能为空.每个人都有名字嘛. 员工号 - 唯一.这个可不能乱,工资发错了就麻烦了. 上面提到的大于.默认.不能为空.唯一等等,就是数据的约束条件. 我们在用CREATE TABLE 创