cordova-sqlite-storage/ionic-native/sqlite能否修改synchronous等pragma配置
核心结论
cordova-sqlite-storage/ionic-native/sqlite 支持修改 page size、synchronous 在内的绝大多数 SQLite PRAGMA 设置,你遇到的 synchronous 配置不生效是执行规则和执行时机的问题,并非不支持修改。
不生效原因说明
journal_mode属于持久化级 PRAGMA,执行修改后会自动写入数据库文件头,后续所有新连接都会沿用修改后的配置,因此单次执行即可长期生效。synchronous属于会话级 PRAGMA,默认不会持久化到数据库文件,仅在当前数据库连接的生命周期内有效,每次新建数据库连接后都会重置为默认值,你之前的操作大概率是没有在每次打开连接后都重新执行配置,导致看起来没有生效。page_size属于特殊的初始化级 PRAGMA,仅允许在数据库首次初始化、还未创建任何表/写入任何数据之前修改,数据库完成初始化后再执行修改语句不会生效,需要重建数据库才可以调整。
正确配置方案
- 统一在数据库打开成功的回调中执行所有 PRAGMA 配置,确保每次新建连接都能复用统一配置,示例代码如下:
import { SQLite, SQLiteObject } from '@ionic-native/sqlite/ngx'; // 数据库初始化逻辑 this.sqlite.create({ name: '自定义数据库名.db', location: 'default' }) .then((db: SQLiteObject) => { // 连接建立后第一时间执行PRAGMA配置,早于所有业务读写操作 // 设置synchronous为NORMAL db.executeSql('PRAGMA synchronous = 1;', []) .catch(e => console.error('设置synchronous失败', e)); // 开启WAL模式 db.executeSql('PRAGMA journal_mode = WAL;', []) .catch(e => console.error('开启WAL失败', e)); // 若为全新数据库需要修改page size,必须在建表之前执行 // db.executeSql('PRAGMA page_size = 4096;', []); // 后续再执行建表、业务读写等其他操作 }) .catch(e => console.error('数据库打开失败', e));
- 验证配置是否生效:每次设置完成后,执行查询语句确认当前生效值即可
PRAGMA synchronous; -- 返回值为1即代表NORMAL模式已生效 PRAGMA journal_mode; -- 返回值为wal即代表WAL模式已生效
- 持久化兼容方案:如果需要降低每次连接重复设置的成本,可以在开启WAL模式并设置
synchronous = 1后执行一次VACUUM指令,多数SQLite版本会将该配置和WAL绑定存储,不过为了全版本兼容依然建议每次连接建立后都重新执行配置。
内容的提问来源于stack exchange,提问作者Kaneki Ken
相关产品推荐
相关产品推荐

