Titanium SDK 数据库操作详解:Titanium.Database.DB 模块指南

Titanium SDK 数据库操作详解:Titanium.Database.DB 模块指南

【免费下载链接】titanium-sdk 🚀 Native iOS and Android Apps with JavaScript 【免费下载链接】titanium-sdk 项目地址: https://gitcode.com/gh_mirrors/ti/titanium-sdk

前言

还在为移动应用中的数据存储而烦恼吗?每次都需要为iOS和Android平台分别编写不同的数据库代码?Titanium SDK的Database模块为你提供了统一的SQLite数据库操作接口,让你用JavaScript就能轻松处理跨平台的数据持久化需求。本文将深入解析Titanium.Database.DB模块的完整使用指南,帮助你掌握高效的移动端数据存储方案。

通过本文,你将学到:

  • Titanium数据库模块的核心架构和工作原理
  • 完整的数据库创建、打开、关闭操作流程
  • SQL语句执行和结果集处理的详细方法
  • 事务处理和批量操作的优化技巧
  • 实际项目中的最佳实践和性能优化建议

1. Titanium数据库模块架构解析

Titanium SDK的数据库模块基于SQLite引擎,为开发者提供了统一的JavaScript API接口。其核心架构如下图所示:

mermaid

1.1 核心组件说明

组件名称类型功能描述
DatabaseModuleObjective-C模块数据库模块入口,提供open/install方法
TiDatabaseProxy数据库代理封装数据库连接和SQL执行功能
TiDatabaseResultSetProxy结果集代理处理SQL查询返回的数据结果
PLSqliteDatabaseSQLite封装底层SQLite数据库操作封装

2. 数据库基础操作

2.1 创建和打开数据库

Titanium提供了两种创建数据库的方式:

// 方式1:创建新的空数据库
var db = Ti.Database.open('mydatabase');

// 方式2:安装预置的数据库文件
var db = Ti.Database.install('mydatabase.sqlite', 'mydatabase');

2.2 数据库文件管理

数据库文件默认存储在应用的私有目录中,不同平台的存储路径:

平台默认存储路径说明
iOSApplication 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_STRING0字符串类型
FIELD_TYPE_INT1整型
FIELD_TYPE_FLOAT2浮点型
FIELD_TYPE_DOUBLE3双精度浮点型
// 明确指定字段类型
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模块为移动应用开发提供了强大而统一的数据库解决方案。通过本文的详细指南,你应该已经掌握了:

  1. ✅ 数据库的创建、打开和关闭操作
  2. ✅ SQL语句的安全执行和结果集处理
  3. ✅ 事务管理和性能优化技巧
  4. ✅ 实际项目中的最佳实践模式

记住关键要点:总是使用参数化查询防止SQL注入,及时关闭结果集释放资源,批量操作时使用事务提升性能。这些实践将帮助你构建高效、稳定的移动应用数据层。

现在就开始在你的Titanium项目中实践这些技术吧!如果有任何问题,欢迎在评论区讨论交流。


进一步学习建议

  • 深入学习SQLite官方文档了解高级特性
  • 探索Titanium其他数据存储方案(Properties、Filesystem)
  • 实践复杂的数据库关系设计和查询优化

记得点赞收藏,随时回来查阅这份完整的数据库操作指南!

【免费下载链接】titanium-sdk 🚀 Native iOS and Android Apps with JavaScript 【免费下载链接】titanium-sdk 项目地址: https://gitcode.com/gh_mirrors/ti/titanium-sdk

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值