Appearance
SQLite 设计
灵动桌面框架使用 SQLite 作为本地数据库,通过 rusqlite 库操作。
为什么选择 SQLite
- 零配置 — 无需安装数据库服务
- 文件级存储 — 单个
.db文件,随应用一起分发 - 性能优秀 — 单用户桌面应用场景下性能极佳
- 可靠性 — ACID 事务保证数据完整性
数据库初始化
rust
// src-tauri/src/database/mod.rs
use rusqlite::Connection;
use std::sync::Mutex;
pub struct Database {
conn: Mutex<Connection>,
}
impl Database {
pub fn new(app_dir: &std::path::Path) -> Result<Self, AppError> {
let db_path = app_dir.join("app.db");
let conn = Connection::open(&db_path)?;
// 启用 WAL 模式(提升并发性能)
conn.execute_batch("PRAGMA journal_mode=WAL;")?;
let db = Self {
conn: Mutex::new(conn),
};
// 执行 Schema 迁移
db.migrate()?;
Ok(db)
}
}全局状态注册
rust
// src-tauri/src/lib.rs
let app_dir = app.path().app_data_dir()?;
std::fs::create_dir_all(&app_dir)?;
let database = Database::new(&app_dir)?;
let app_state = AppState::new(database);
app.manage(app_state);表设计规范
- 主键使用
INTEGER PRIMARY KEY AUTOINCREMENT - 时间字段使用
TEXT,存储 ISO 8601 格式 - 字符串字段默认
NOT NULL DEFAULT '' - 每张表包含
created_at和updated_at
sql
CREATE TABLE IF NOT EXISTS app_config (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key TEXT NOT NULL UNIQUE,
value TEXT NOT NULL DEFAULT '',
created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')),
updated_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime'))
);