深入解析Android中的SQLite数据库
作者:楼外蔷薇花开 | 来源:互联网 | 2024-11-26 21:57
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 ", new String[]{"35"}); // 关闭当前数据库 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()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ...
[详细]
蜡笔小新 2024-12-28 10:51:55
本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ...
[详细]
蜡笔小新 2024-12-27 16:11:49
本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ...
[详细]
蜡笔小新 2024-12-26 17:55:52
Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ...
[详细]
蜡笔小新 2024-12-28 08:54:34
本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ...
[详细]
蜡笔小新 2024-12-27 16:20:10
本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ...
[详细]
蜡笔小新 2024-12-27 16:01:25
本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ...
[详细]
蜡笔小新 2024-12-27 13:55:14
本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ...
[详细]
蜡笔小新 2024-12-26 18:31:42
本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ...
[详细]
蜡笔小新 2024-12-25 21:01:14
本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ...
[详细]
蜡笔小新 2024-12-25 19:59:15
本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ...
[详细]
蜡笔小新 2024-12-28 10:30:14
本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ...
[详细]
蜡笔小新 2024-12-27 11:30:44
本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ...
[详细]
蜡笔小新 2024-12-26 19:42:38
本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ...
[详细]
蜡笔小新 2024-12-26 17:34:42
本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ...
[详细]
蜡笔小新 2024-12-25 22:04:04