SQLite数据库
SQLite 是一种轻量级、嵌入式的关系型数据库管理系统,它无需独立的服务器进程,数据存储在一个单一的文件中。触发器是一种机制,它允许在特定的事件(如插入、更新或删除记录时)自动执行预定义的 SQL 语句。通过为表的某些列创建索引,可以提高查询性能,尤其是当数据量较大时。视图是一个虚拟表,它不存储数据,只存储 SQL 查询。SQLite 的类型系统相对宽松,它允许列中的数据类型与定义的类型不同。事
SQLite 数据库详解
SQLite 是一种轻量级、嵌入式的关系型数据库管理系统,它无需独立的服务器进程,数据存储在一个单一的文件中。由于其便捷性和稳定性,SQLite 被广泛应用于移动设备、桌面应用和嵌入式系统中。以下是对 SQLite 的详细讲解。
一、SQLite 的主要特点
-
嵌入式数据库:
- SQLite 是嵌入式数据库管理系统,数据库引擎与应用程序捆绑在一起,没有独立的服务器进程。这意味着数据存储在一个本地文件中,应用程序可以直接操作文件,无需网络通信。
-
轻量级:
- SQLite 的体积非常小,整个库通常只有几百 KB 的大小,非常适合资源有限的设备或场景。
-
无服务器:
- SQLite 不需要数据库服务器。所有数据库操作都在本地执行,不依赖于外部服务。应用程序可以直接通过 SQL 操作数据库文件。
-
零配置:
- SQLite 不需要复杂的配置或管理。应用程序可以直接创建数据库文件并开始使用,不需要专门的数据库管理员进行安装、配置或优化。
-
事务支持:
- SQLite 支持 ACID(原子性、一致性、隔离性和持久性)事务管理,确保数据库操作的可靠性。事务要么全部成功,要么全部回滚,保持数据一致性。
-
单一数据库文件:
- 所有的表、索引、视图和触发器等数据都存储在一个单一的文件中。这使得备份和迁移数据库变得非常简单。
-
跨平台:
- SQLite 支持几乎所有操作系统(Windows、Linux、MacOS、Android、iOS 等),并且数据库文件格式跨平台兼容,可以轻松在不同平台之间共享。
二、SQLite 的核心概念
1. 数据库
SQLite 的数据库是一个文件。这个文件存储了数据库的所有数据和结构(如表、索引、视图等)。通过 SQL 语句,应用程序可以对这个文件进行读写操作。
2. 表 (Table)
表是数据库中用于存储数据的主要结构,由行和列组成。每一行代表一条记录,每一列代表一个字段。
3. 列 (Column)
列定义了表中存储的数据类型和属性,如整数、文本、浮点数等。每一列都有一个名称和数据类型,类似于表单中的字段。
4. 行 (Row)
行是表中的一条记录,表示实际存储的数据。每一行由多个列的数据组成。
5. 索引 (Index)
索引是一种加速数据查询的结构。通过为表的某些列创建索引,可以提高查询性能,尤其是当数据量较大时。SQLite 支持为单列或多列创建索引。
6. 视图 (View)
视图是一个虚拟表,它不存储数据,只存储 SQL 查询。视图的使用可以简化复杂查询,并使得数据库结构更加清晰。
7. 触发器 (Trigger)
触发器是一种机制,它允许在特定的事件(如插入、更新或删除记录时)自动执行预定义的 SQL 语句。触发器可以用于保持数据的一致性或自动化任务。
三、SQLite 数据类型
SQLite 的类型系统相对宽松,它允许列中的数据类型与定义的类型不同。即使某一列被定义为 INTEGER
类型,实际上仍然可以存储字符串或其他类型的数据。但 SQLite 提供了一些基本的数据类型:
- NULL:表示空值。
- INTEGER:带符号的整数,存储 1 到 8 字节,具体取决于数值的大小。
- REAL:浮点数,存储为 8 字节的 IEEE 浮点数。
- TEXT:文本字符串,使用 UTF-8、UTF-16BE 或 UTF-16LE 编码存储。
- BLOB:二进制大对象,存储为原始数据,不进行任何转换。
四、SQLite 的基本操作
SQLite 支持标准的 SQL 操作,以下是一些常见的操作和示例:
1. 创建表
使用 CREATE TABLE
语句可以创建一个表。
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键,自动递增
name TEXT NOT NULL, -- 名称,不能为空
age INTEGER, -- 年龄
email TEXT -- 邮箱
);
PRIMARY KEY
定义主键,它唯一标识表中的每一行。AUTOINCREMENT
自动为每次插入的数据生成递增的 ID。NOT NULL
表示该字段不能为空。
2. 插入数据
使用 INSERT INTO
语句插入数据。
INSERT INTO users (name, age, email)
VALUES ('Alice', 30, 'alice@example.com');
可以一次插入多条记录:
INSERT INTO users (name, age, email)
VALUES ('Bob', 25, 'bob@example.com'),
('Charlie', 35, 'charlie@example.com');
3. 查询数据
使用 SELECT
语句从表中查询数据。
SELECT name, age FROM users WHERE age > 25;
查询所有记录:
SELECT * FROM users;
按条件排序查询结果:
SELECT * FROM users ORDER BY age DESC;
4. 更新数据
使用 UPDATE
语句更新现有记录。
UPDATE users
SET email = 'alice_new@example.com'
WHERE name = 'Alice';
5. 删除数据
使用 DELETE FROM
语句删除记录。
DELETE FROM users WHERE name = 'Alice';
删除表中的所有数据:
DELETE FROM users;
6. 删除表
使用 DROP TABLE
删除整个表。
DROP TABLE IF EXISTS users;
五、SQLite 的事务管理
事务可以确保一组数据库操作的完整性,所有操作要么全部成功,要么全部失败。
- 开启事务:
BEGIN TRANSACTION;
- 提交事务:
COMMIT;
- 回滚事务:
ROLLBACK;
示例:使用事务进行操作:
BEGIN TRANSACTION;
INSERT INTO users (name, age, email) VALUES ('John', 40, 'john@example.com');
UPDATE users SET age = 41 WHERE name = 'John';
COMMIT;
如果在 COMMIT
之前操作失败,可以使用 ROLLBACK
恢复到事务开始之前的状态。
六、SQLite 在 Android 中的使用
在 Android 开发中,SQLite 是默认的数据库系统,使用 SQLiteOpenHelper
类可以方便地管理数据库的创建和版本升级,SQLiteDatabase
类用于执行 SQL 操作。
1. 创建 SQLiteOpenHelper 类
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "MyDatabase.db";
private static final int DATABASE_VERSION = 1;
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 创建数据库时调用
String CREATE_TABLE = "CREATE TABLE users ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "name TEXT,"
+ "age INTEGER,"
+ "email TEXT);";
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 当数据库版本升级时调用
db.execSQL("DROP TABLE IF EXISTS users");
onCreate(db);
}
}
2. 操作数据库
使用 SQLiteDatabase
类进行增删改查操作。
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 插入数据
ContentValues values = new ContentValues();
values.put("name", "Alice");
values.put("age", 30);
values.put("email", "alice@example.com");
db.insert("users", null, values);
// 查询数据
Cursor cursor = db.query("users", null, null, null, null, null, null);
// 更新数据
ContentValues updateValues = new ContentValues();
updateValues.put("email", "alice_new@example.com");
db.update("users", updateValues, "name = ?", new String[]{"Alice"});
// 删除数据
db.delete("users", "name = ?", new String[]{"Alice"});
七、SQLite 的优缺点
优点:
- 轻量级:SQLite 占用空间小,适合嵌入式设备和移动设备。
- 无需服务器:SQLite 无需服务器支持,数据操作直接本地执行。
- 跨平台兼容:数据库文件可以在不同操作系统之间直接共享。
- 高效:SQLite
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)