面试题答案
一键面试利用SQLiteDatabase进行复杂事务处理保证数据一致性
- 开始事务:在执行一系列关联操作前,调用
db.beginTransaction();
开始事务。 - 执行操作:依次执行多表关联的插入、更新或删除等操作。
- 设置事务成功标志:若所有操作都执行成功,调用
db.setTransactionSuccessful();
。 - 结束事务:无论操作结果如何,最后都调用
db.endTransaction();
,若事务成功标志被设置,事务内操作将被提交,否则回滚。
示例代码如下:
SQLiteDatabase db = // 获取SQLiteDatabase实例
try {
db.beginTransaction();
// 执行多表关联操作,例如:
db.execSQL("INSERT INTO table1 (column1, column2) VALUES (?,?)", new String[]{"value1", "value2"});
db.execSQL("UPDATE table2 SET column3 =? WHERE id =?", new String[]{"newValue", "1"});
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction();
}
高并发读写场景性能优化措施
- 使用事务批量操作:将多个读写操作放在一个事务内,减少磁盘I/O次数。
- 合理创建索引:分析查询语句,在经常用于
WHERE
子句、JOIN
子句的列上创建索引,加快查询速度。 - 优化SQL语句:避免全表扫描,尽量使用覆盖索引,减少不必要的列选择。
- 连接池:使用连接池管理数据库连接,减少连接创建和销毁的开销。
- 读写分离:如果业务允许,可将读操作和写操作分离到不同的数据库实例(虽然SQLite本身不支持传统意义上的读写分离,但可在应用层面模拟)。
关键代码示例 - 批量插入
SQLiteDatabase db = // 获取SQLiteDatabase实例
ContentValues[] valuesArray = new ContentValues[10];
for (int i = 0; i < 10; i++) {
ContentValues values = new ContentValues();
values.put("column1", "value" + i);
values.put("column2", i);
valuesArray[i] = values;
}
try {
db.beginTransaction();
for (ContentValues values : valuesArray) {
db.insert("table_name", null, values);
}
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction();
}
关键代码示例 - 创建索引
SQLiteDatabase db = // 获取SQLiteDatabase实例
db.execSQL("CREATE INDEX idx_column1 ON table_name (column1);");