热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析Android中的SQLite数据库

SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。
SQLite是一个广泛应用于移动设备上的关系型数据库引擎,它以其轻量级和高效能著称。尽管其体积小,但SQLite能够支持非常大的数据库,最高可达2TB。每个数据库文件都是独立存在的,这使得SQLite非常适合于嵌入式系统和移动应用。

### 数据存储机制
SQLite使用B-Tree数据结构来存储数据,这种结构不仅支持高效的查找,还允许快速的数据插入和删除。每个数据库文件都包含了所有的表格、索引以及视图等数据库对象。

### 事务处理
SQLite通过数据库级别的锁定机制来确保事务的独立性。这意味着,在任何给定时间,多个进程可以同时读取同一个数据库,但是只有单一进程可以进行写操作。当一个进程打算对数据库进行写入时,它必须首先获取一个独占锁。一旦这个锁被获取,其他的所有读写操作都将被阻塞,直到当前写操作完成。

### 动态数据类型
SQLite支持动态数据类型,这意味着在插入数据时,SQLite会自动检测数据类型,并根据目标列的数据类型进行可能的转换。例如,如果试图将一个字符串插入到一个整数类型的列中,SQLite会尝试将字符串转换为整数;如果转换失败,则保持原始数据类型。然而,对于定义为INTEGER PRIMARY KEY的列,任何非整数值的插入都会导致类型不匹配错误。

### 支持的数据类型
SQLite支持五种基本的数据类型:NULL(空值)、INTEGER(整型值)、REAL(浮点值)、TEXT(字符串文本)和BLOB(二进制大对象)。这些类型覆盖了大多数常见的数据需求。

### 示例代码
以下是在Android应用中使用SQLite的一个简单示例,展示了如何创建数据库、表,以及如何进行插入、查询、更新和删除操作:
```java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 打开或创建test.db数据库
SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
db.execSQL("DROP TABLE IF EXISTS person");
// 创建person表
db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");
Person person = new Person();
person.name = "john";
person.age = 30;
// 插入数据
db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[]{person.name, person.age});
person.name = "david";
person.age = 33;
ContentValues cv = new ContentValues();
cv.put("name", person.name);
cv.put("age", person.age);
// 插入ContentValues中的数据
db.insert("person", null, cv);
cv = new ContentValues();
cv.put("age", 35);
// 更新数据
db.update("person", cv, "name = ?", new String[]{"john"});
Cursor c = db.rawQuery("SELECT * FROM person WHERE age >= ?", new String[]{"33"});
while (c.moveToNext()) {
int _id = c.getInt(c.getColumnIndex("_id"));
String name = c.getString(c.getColumnIndex("name"));
int age = c.getInt(c.getColumnIndex("age"));
Log.i("db", "_id=>" + _id + ", name=>" + name + ", age=>" + age);
}
c.close();
// 删除数据
db.delete("person", "age // 关闭当前数据库
db.close();
}
```
上述代码执行完毕后,将在`/data/data/[PACKAGE_NAME]/databases`目录下生成名为`test.db`的数据库文件。

### 数据库操作方法
除了通用的`executeSQL`方法外,SQLite还提供了专门用于插入、更新和删除记录的方法:
- `db.insert(String table, String nullColumnHack, ContentValues values)`:向指定表中插入新记录。
- `db.update(String table, ContentValues values, String whereClause, String[] whereArgs)`:更新表中满足特定条件的记录。
- `db.delete(String table, String whereClause, String[] whereArgs)`:删除表中满足特定条件的记录。

### 查询操作
查询操作相对复杂,SQLite提供了多种查询方法来应对不同的查询需求:
- `db.rawQuery(String sql, String[] selectionArgs)`:执行任意的SQL查询。
- `db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)`:提供详细的查询参数设置。
- `db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)`:增加分页参数。
- `db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)`:支持去重查询。

### Cursor对象
查询结果通常以`Cursor`对象的形式返回,`Cursor`提供了多种方法来遍历和访问查询结果集:
- `moveToFirst()`:移动到结果集的第一条记录。
- `moveToLast()`:移动到最后一条记录。
- `moveToNext()`:移动到下一条记录。
- `moveToPrevious()`:移动到前一条记录。
- `isFirst()`:判断是否位于第一条记录。
- `isLast()`:判断是否位于最后一条记录。
- `getCount()`:获取结果集中记录的总数。
- `getColumnIndex(String columnName)`:获取指定列的索引。
- `getString(int columnIndex)`:获取指定列的字符串值。

在完成数据库操作后,务必调用`SQLiteDatabase`的`close()`方法来释放资源,避免出现`SQLiteException`异常。
推荐阅读
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
author-avatar
楼外蔷薇花开
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有