1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| class OfflineStorage { constructor() { this.version = '1.0.0' this.table = 'offline_data' } async init() { return new Promise((resolve, reject) => { plus.sqlite.openDatabase({ name: 'app.db', path: '_doc/app.db', success: () => { this.createTable() resolve() }, fail: reject }) }) } createTable() { const sql = ` CREATE TABLE IF NOT EXISTS ${this.table} ( id TEXT PRIMARY KEY, data TEXT, expire INTEGER, version TEXT ) ` plus.sqlite.executeSql({ name: 'app.db', sql }) } save(key, data, expire = 0) { const sql = ` REPLACE INTO ${this.table} (id, data, expire, version) VALUES (?, ?, ?, ?) ` const values = [ key, JSON.stringify(data), expire ? Date.now() + expire * 1000 : 0, this.version ] plus.sqlite.executeSql({ name: 'app.db', sql, values }) } async get(key) { return new Promise((resolve, reject) => { const sql = ` SELECT * FROM ${this.table} WHERE id = ? AND version = ? ` plus.sqlite.selectSql({ name: 'app.db', sql, values: [key, this.version], success: res => { if (!res.length) { resolve(null) return } const { data, expire } = res[0] if (expire && expire < Date.now()) { this.remove(key) resolve(null) return } resolve(JSON.parse(data)) }, fail: reject }) }) } remove(key) { const sql = ` DELETE FROM ${this.table} WHERE id = ? ` plus.sqlite.executeSql({ name: 'app.db', sql, values: [key] }) } clear() { const sql = ` DELETE FROM ${this.table} WHERE version = ? ` plus.sqlite.executeSql({ name: 'app.db', sql, values: [this.version] }) } }
export default new OfflineStorage()
|