欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-01-03 12:14:00
本文实例讲述了android sqlite数据库操作方法。分享给大家供大家参考,具体如下: sqlite and android sqlite简介 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程序设计有所帮助。