热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要介绍了Android编程之SQLite数据库操作方法,简单介绍了SQLite数据库及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 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(&#63;, &#63;, &#63;, &#63;, &#63;, &#63;, &#63;)";
  wsd.execSQL(sql,
    new Object[] { accData.getUserName(), accData.getUserNick(), accData.getUrl(), accData.getPort(),
      accData.getToken(), accData.getSecret(), accData.getJson(), accData.getThreads(), });
 }
 public List getAccountDatas() {
  List listDatas = selectAccountData();
  return listDatas;
 }
 private List selectAccountData() {
  List listAccountData = new ArrayList();
  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 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程序设计有所帮助。


推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文探讨了在 PHP 中处理 JSON 编码时中文字符显示为 Unicode 转义序列的问题,并提供了多种有效的解决方法,包括使用正则表达式替换、URL 编码以及利用 PHP 5.4 及以上版本提供的 JSON_UNESCAPED_UNICODE 选项。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 精选30本C# ASP.NET SQL中文PDF电子书合集
    欢迎订阅我们的技术博客,获取更多关于C#、ASP.NET和SQL的最新资讯和资源。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文介绍如何在 FireDAC 环境下实现 FDMEMTable 字段的自动获取,为开发人员提供便捷的数据处理方式。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • openGauss每日一练:第6天 - 模式的创建、修改与删除
    本篇笔记记录了openGauss数据库中关于模式(Schema)的创建、修改和删除操作。通过这些操作,用户可以更好地管理和控制数据库对象。实验环境为openGauss 2.0.0,并使用由墨天轮提供的线上环境。 ... [详细]
author-avatar
AIHFKYH_986
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有