INTEGER
替代TEXT
存储数字,REAL
替代DOUBLE
)。字段类型 | 适用场景 | 存储大小 |
---|---|---|
INTEGER | 整数ID/计数 | 4字节 |
TEXT | 短字符串(<2K) | 动态分配 |
REAL | 浮点数计算 | 8字节 |
BLOB | 二进制数据(如图片) | 动态分配 |
PRIMARY KEY
,类型建议INTEGER PRIMARY KEY AUTOINCREMENT
。UNIQUE
约束。WHERE A=? AND B=?
)创建联合索引。示例:
CREATE INDEX idx_user_name ON users(name); -单字段索引 CREATE INDEX idx_order_date_status ON orders(date, status); -复合索引
WHERE
子句中优先使用索引字段。Room框架示例:
@Query("SELECT FROM user WHERE id = :userId") User getUserById(int userId); // 参数化查询
SELECT
,仅查询必要字段。LIMIT
和OFFSET
(或基于主键的分页)。分页方案对比:
| 方案 | 优点 | 缺点 |
|—————|————————|————————–|
| LIMIT+OFFSET
| 实现简单 | 大偏移量时性能差 |
| 基于主键分页 | 高效定位数据 | 需维护连续主键或时间戳 |
示例(使用sqlite
):
SQLiteDatabase db = getWritableDatabase(); db.beginTransaction(); try { // 多次insert/update操作 db.setTransactionSuccessful(); } finally { db.endTransaction(); }
GreenDAO
的insertInTx
方法自动批量插入。GreenDAO示例:
DaoSession session = ...; UserDao userDao = session.getUserDao(); List<User> users = ...; userDao.insertInTx(users); // 自动开启事务批量插入
try-finally
或CursorLoader
自动管理。示例(Kotlin协程优化):
val result = database.query("SELECT id, name FROM user WHERE id = ?", arrayOf(userId)) .useLineSequence() // 自动关闭Cursor并转换为序列 .firstOrNull()
SQLCipher
加密数据库文件,避免明文存储敏感数据。VACUUM
命令压缩数据库文件,防止文件碎片化。PRAGMA busy_timeout
和PRAGMA journal_mode
调整日志模式。EXPLAIN QUERY PLAN
查看SQL执行路径。解答:
WHERE status=? AND date>?
)。 解答:
LIMIT+OFFSET
简单易用,但数据量大时性能下降。 WHERE id > ? ORDER BY id LIMIT 10
),性能更稳定。 INDEX
和覆盖索引
(返回字段包含在索引中)提升效率