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

(0)

相关推荐

  • Android SQLite数据库基本操作方法

    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能.而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库.那么就来看一下在Android程序中怎么去操作SQLite数据库来实现一些需求的吧,仍然以一个小例子开始: 在创建Android项目之前,我们应该想一下我们要定义的数据库的相关信息和里面的表格的相关信息,为了日后数据库的更新更加方便 ,我们可以用一个专门的类保存数据库的相关信息,以后如果要更新数据库的话只需要该动这个类

  • Android利用listview控件操作SQLite数据库实例

    在本实例中,首先我们利用SQLiteOpenHelper类建立一个数据库,并写好增.删.查等方法,通过SimpleCursorAdapter连接listview实现数据库的增加.查询以及长按删除的功能. 首先,我们先认识一下什么是SQLiteOpenHelper类. Android为了操作SQlite数据库,提供了SQLiteDatabase类,其内封装了insert .delete.update .query .执行SQL命令等操作.同时又为SQLiteDatabase提供了一个辅助类,SQL

  • Android批量插入数据到SQLite数据库的方法

    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度. 有时需要把一些数据内置到应用中,常用的有以下几种方式: 1.使用db.execSQL(sql) 这里是把要插入的数据拼接成可执行的sql语句,然后调用db.execSQL(sql)方法执行插入. public void inertOrUpdateDateBatch(List<

  • android SQLite数据库总结

    SQLite SQLite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准SQL语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌握其使用. sql语法就不介绍了,直接看在android中的使用 SQLiteOpenHelper--封装好的数据库操作辅助类,需重写 重写方法 onCreate:初始化数据库,创建表,添加初始数据 onUpgrade:数据库版本升级时的数据库操作,如备份删除数据库等 常用方法 getReadableDatabase() 

  • Android SQLite事务处理结合Listview列表显示功能示例

    本文实例讲述了Android SQLite事务处理结合Listview列表显示功能.分享给大家供大家参考,具体如下: 前面的文章里介绍过事务的特点如原子性,隔离性,一致性,持久性.下面就结合Android的sqlite来说下,这次的文章里会把listview也结合起来用.实际上android里的事务和我们数据库里的是一样的.也是开启事务,操作,提交事务.如果出现问题就回滚. public void Transaction(){ SQLiteDatabase database=db.getRead

  • Android使用SQLite数据库的示例

    一. 简介 SQLite数据库是一个轻量级的DBMS(数据库管理系统).SQLite使用单个文件存储数据,Android标准库包含SQLite库以及配套使用的一些Java辅助类.主要特点:轻量级,单一文件,跨平台,开源. 二. Android中SQLite数据库的使用 1.创建SQLite数据库 SQLiteDatabase db= SQLiteDatabase.openOrCreateDatabase( "/data/data/" + getPackageName() + "

  • Android开发笔记SQLite优化记住密码功能

    本文实例为大家分享了Android SQLite优化记住密码功能的具体代码,供大家参考,具体内容如下 package com.example.alimjan.hello_world; /** * Created by alimjan on 7/4/2017. */ import com.example.alimjan.hello_world.bean.UserInfo; import com.example.alimjan.hello_world.dataBase.UserDBHelper; i

  • Android SQLite数据库版本升级的管理实现

    Android SQLite数据库版本升级的管理实现 我们知道在SQLiteOpenHelper的构造方法: super(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 中最后一个参数表示数据库的版本号.当新的版本号大于当前的version时会调用方法: onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 所以我们

  • Android编程之SQLite数据库操作方法详解

    本文实例讲述了Android SQLite数据库操作方法.分享给大家供大家参考,具体如下: SQLite and Android SQLite简介 SQLite是一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.此外,它还是开源的,任何人都可以使用它. SQLite由以下几个组件组成:SQL编译器.内核.后端以及附件.SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试.修改和扩展SQLite的内核变得更加方便. SQLite支持的数据类型包括: 1.

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

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

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

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

  • django基础之数据库操作方法(详解)

    Django 自称是"最适合开发有限期的完美WEB框架".本文参考<Django web开发指南>,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明,如果你是第一次接触Django ,本文会让你在感性上对Django有个认识,完成本文操作后会让你有兴趣阅读的相关书籍和文档. 本文客操作的环境,如无特别说明,后续都以下面的环境为基础: =================== Windows 7/10 python 3.5 Django 1.10 ======

  • Java并发编程之ConcurrentLinkedQueue源码详解

    一.ConcurrentLinkedQueue介绍 并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式: 方式1:加锁,这种实现方式就是我们常说的阻塞队列. 方式2:使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列. 从点到面, 下面我们来看下非阻塞队列经典实现类:ConcurrentLinkedQueue (JDK1.8版) ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全的队列.当我们添加一个元素的时候,它会添加到队列的尾部,当我们

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

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

  • 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.

  • Python使用pyodbc访问数据库操作方法详解

    本文实例讲述了Python使用pyodbc访问数据库操作方法. 数据库连接 数据库连接网上大致有两种方法,一种是使用pyodbc,另一种是使用win32com.client,测试了很多遍,最终只有pyodbc成功,而且比较好用,所以这里只介绍这种方法 工具库安装 在此基础上安装pyodbc工具库,在cmd窗口执行如下语句安装 pip install pyodbc 如果安装了anaconda也可以使用conda install pyodbc 分享给大家供大家参考,具体如下: 检验是否可以正常连接数

  • java 开发中网络编程之IP、URL详解及实例代码

    java 网络编程 java.net 类 InetAddress 此类表示互联网协议 (IP) 地址. 会抛出异常 UnknownHostException 直接已知子类: Inet4Address, Inet6Address 没有构造函数,但是可以通过静态方法获取对象后,在完成其它功能的使用. 例如: static InetAddress getLocalHost() 返回本地主机. static InetAddress getByName(String host) 在给定主机名的情况下确定主

  • Java图形化编程之JFrame疫苗接种系统详解

    目录 1.功能模块 1.1登陆模块 1.1.1思路: 1.1.2核心代码: 1.1.3运行效果: 1.2信息展示模块(从txt文件中读取) 1.2.1思路: 1.2.2核心代码 : 1.2.3运行效果: 1.3新增记录模块(并更新txt) 1.3.1思路: 1.3.2核心代码 1.3.3运行效果 1.4删除记录(含多选删除并更新txt) 1.5修改记录(并更新txt) 1.6多条件查询 总结 1.功能模块 1.1登陆模块 1.1.1思路: 利用JFrame弹出一个登陆界面,用户输入admin和1

随机推荐