Titanium SDK 数据库操作详解:Titanium.Database.DB 模块指南
前言
还在为移动应用中的数据存储而烦恼吗?每次都需要为iOS和Android平台分别编写不同的数据库代码?Titanium SDK的Database模块为你提供了统一的SQLite数据库操作接口,让你用JavaScript就能轻松处理跨平台的数据持久化需求。本文将深入解析Titanium.Database.DB模块的完整使用指南,帮助你掌握高效的移动端数据存储方案。
通过本文,你将学到:
- Titanium数据库模块的核心架构和工作原理
- 完整的数据库创建、打开、关闭操作流程
- SQL语句执行和结果集处理的详细方法
- 事务处理和批量操作的优化技巧
- 实际项目中的最佳实践和性能优化建议
1. Titanium数据库模块架构解析
Titanium SDK的数据库模块基于SQLite引擎,为开发者提供了统一的JavaScript API接口。其核心架构如下图所示:
1.1 核心组件说明
| 组件名称 | 类型 | 功能描述 |
|---|---|---|
| DatabaseModule | Objective-C模块 | 数据库模块入口,提供open/install方法 |
| TiDatabaseProxy | 数据库代理 | 封装数据库连接和SQL执行功能 |
| TiDatabaseResultSetProxy | 结果集代理 | 处理SQL查询返回的数据结果 |
| PLSqliteDatabase | SQLite封装 | 底层SQLite数据库操作封装 |
2. 数据库基础操作
2.1 创建和打开数据库
Titanium提供了两种创建数据库的方式:
// 方式1:创建新的空数据库
var db = Ti.Database.open('mydatabase');
// 方式2:安装预置的数据库文件
var db = Ti.Database.install('mydatabase.sqlite', 'mydatabase');
2.2 数据库文件管理
数据库文件默认存储在应用的私有目录中,不同平台的存储路径:
| 平台 | 默认存储路径 | 说明 |
|---|---|---|
| iOS | Application Support目录 | 应用更新时数据保留 |
| Android | /data/data/ /databases/ | 应用私有目录 |
3. SQL操作详解
3.1 执行SQL语句
Titanium支持多种SQL执行方式:
// 基本执行 - 返回结果集
var resultSet = db.execute('SELECT * FROM users WHERE age > ?', 18);
// 异步执行 - 避免阻塞UI线程
db.executeAsync('INSERT INTO logs (message) VALUES (?)', 'User logged in')
.then(function(result) {
Ti.API.info('Insert completed: ' + result.rowsAffected);
})
.catch(function(error) {
Ti.API.error('Insert failed: ' + error.message);
});
// 批量执行多条SQL
var queries = [
'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
'CREATE INDEX IF NOT EXISTS idx_users_age ON users(age)'
];
var results = db.executeAll(queries);
3.2 参数化查询
使用参数化查询防止SQL注入攻击:
// 正确的方式 - 使用参数化查询
db.execute('INSERT INTO users (name, age) VALUES (?, ?)', 'John Doe', 25);
// 错误的方式 - 字符串拼接(易受SQL注入攻击)
var name = "John'; DROP TABLE users; --";
db.execute("INSERT INTO users (name) VALUES ('" + name + "')"); // 危险!
4. 结果集处理
4.1 遍历查询结果
var resultSet = db.execute('SELECT id, name, age FROM users');
while (resultSet.isValidRow()) {
var userId = resultSet.field(0); // 按索引获取
var userName = resultSet.fieldByName('name'); // 按字段名获取
var userAge = resultSet.fieldByName('age', Ti.Database.FIELD_TYPE_INT);
Ti.API.info('User: ' + userName + ', Age: ' + userAge);
resultSet.next(); // 移动到下一行
}
resultSet.close(); // 重要:必须关闭结果集
4.2 字段类型处理
Titanium提供了明确的字段类型常量:
| 类型常量 | 值 | 说明 |
|---|---|---|
| FIELD_TYPE_UNKNOWN | -1 | 未知类型 |
| FIELD_TYPE_STRING | 0 | 字符串类型 |
| FIELD_TYPE_INT | 1 | 整型 |
| FIELD_TYPE_FLOAT | 2 | 浮点型 |
| FIELD_TYPE_DOUBLE | 3 | 双精度浮点型 |
// 明确指定字段类型
var age = resultSet.fieldByName('age', Ti.Database.FIELD_TYPE_INT);
var salary = resultSet.fieldByName('salary', Ti.Database.FIELD_TYPE_DOUBLE);
5. 事务处理与性能优化
5.1 事务操作
使用事务可以显著提升批量操作的性能:
// 开始事务
db.execute('BEGIN TRANSACTION');
try {
// 批量插入数据
for (var i = 0; i < 1000; i++) {
db.execute('INSERT INTO data (value) VALUES (?)', 'value_' + i);
}
// 提交事务
db.execute('COMMIT');
} catch (e) {
// 回滚事务
db.execute('ROLLBACK');
Ti.API.error('Transaction failed: ' + e.message);
}
5.2 性能优化建议
| 优化措施 | 效果 | 实现方式 |
|---|---|---|
| 使用事务 | 提升10-100倍 | BEGIN/COMMIT TRANSACTION |
| 参数化查询 | 防止注入,提升性能 | 使用?占位符 |
| 索引优化 | 加速查询 | CREATE INDEX |
| 异步操作 | 避免UI阻塞 | executeAsync() |
| 及时关闭 | 释放资源 | resultSet.close() |
6. 实战案例:用户管理系统
6.1 数据库初始化
function initDatabase() {
var db = Ti.Database.open('userdb');
// 创建用户表
db.execute('CREATE TABLE IF NOT EXISTS users (' +
'id INTEGER PRIMARY KEY AUTOINCREMENT, ' +
'username TEXT UNIQUE, ' +
'email TEXT, ' +
'age INTEGER, ' +
'created_at DATETIME DEFAULT CURRENT_TIMESTAMP)');
// 创建索引
db.execute('CREATE INDEX IF NOT EXISTS idx_users_username ON users(username)');
db.execute('CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)');
return db;
}
6.2 用户CRUD操作
var userDB = initDatabase();
// 添加用户
function addUser(username, email, age) {
userDB.execute('INSERT INTO users (username, email, age) VALUES (?, ?, ?)',
username, email, age);
return userDB.lastInsertRowId;
}
// 查询用户
function getUserById(id) {
var rs = userDB.execute('SELECT * FROM users WHERE id = ?', id);
if (rs.isValidRow()) {
var user = {
id: rs.fieldByName('id'),
username: rs.fieldByName('username'),
email: rs.fieldByName('email'),
age: rs.fieldByName('age'),
createdAt: rs.fieldByName('created_at')
};
rs.close();
return user;
}
rs.close();
return null;
}
// 更新用户
function updateUser(id, updates) {
var sets = [];
var params = [];
for (var key in updates) {
sets.push(key + ' = ?');
params.push(updates[key]);
}
params.push(id);
userDB.execute('UPDATE users SET ' + sets.join(', ') + ' WHERE id = ?', params);
}
// 删除用户
function deleteUser(id) {
userDB.execute('DELETE FROM users WHERE id = ?', id);
}
7. 高级特性与最佳实践
7.1 数据库迁移管理
对于需要版本升级的应用,实现简单的迁移机制:
var DB_VERSION = 2;
var currentVersion = Ti.App.Properties.getInt('db_version', 0);
if (currentVersion < DB_VERSION) {
migrateDatabase(currentVersion, DB_VERSION);
Ti.App.Properties.setInt('db_version', DB_VERSION);
}
function migrateDatabase(fromVersion, toVersion) {
var db = Ti.Database.open('appdb');
if (fromVersion < 1) {
// 初始版本创建
db.execute('CREATE TABLE settings (key TEXT PRIMARY KEY, value TEXT)');
}
if (fromVersion < 2) {
// 版本2升级:添加用户表
db.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
}
db.close();
}
7.2 错误处理与调试
function safeExecute(db, sql, params) {
try {
return db.execute(sql, params);
} catch (e) {
Ti.API.error('SQL Error: ' + e.message + '\nSQL: ' + sql);
throw e; // 重新抛出异常
}
}
// 使用包装函数
var result = safeExecute(db, 'SELECT * FROM non_existent_table');
8. 常见问题与解决方案
8.1 性能问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 插入速度慢 | 未使用事务 | 使用BEGIN/COMMIT包装批量操作 |
| 查询速度慢 | 缺少索引 | 为常用查询字段创建索引 |
| 内存占用高 | 结果集未关闭 | 确保每次查询后调用resultSet.close() |
8.2 跨平台兼容性
Titanium数据库模块在iOS和Android平台上具有高度一致性,但仍需注意:
- SQLite语法差异极小,基本可以忽略
- 文件路径处理由Titanium自动处理
- 并发访问机制保持一致
总结
Titanium.Database.DB模块为移动应用开发提供了强大而统一的数据库解决方案。通过本文的详细指南,你应该已经掌握了:
- ✅ 数据库的创建、打开和关闭操作
- ✅ SQL语句的安全执行和结果集处理
- ✅ 事务管理和性能优化技巧
- ✅ 实际项目中的最佳实践模式
记住关键要点:总是使用参数化查询防止SQL注入,及时关闭结果集释放资源,批量操作时使用事务提升性能。这些实践将帮助你构建高效、稳定的移动应用数据层。
现在就开始在你的Titanium项目中实践这些技术吧!如果有任何问题,欢迎在评论区讨论交流。
进一步学习建议:
- 深入学习SQLite官方文档了解高级特性
- 探索Titanium其他数据存储方案(Properties、Filesystem)
- 实践复杂的数据库关系设计和查询优化
记得点赞收藏,随时回来查阅这份完整的数据库操作指南!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



