uni.setStorage({
key: 'storage_key',
data: 'hello',
success: function () {
console.log('success');
}
});
try {
uni.setStorageSync('storage_key', 'hello');
} catch (e) {
// error
}
uni.getStorage({
key: 'storage_key',
success: function (res) {
console.log(res.data);
}
});
try {
const value = uni.getStorageSync('storage_key');
console.log(value);
} catch (e) {
// error
}
适合 key、value 键值对的存储, 数据量一般不超过 5M。是常用的轻量数据存储方案。不能跨域。
保存数据:
localStorage.setItem("key", "value");
读取数据:
var lastname = localStorage.getItem("key");
删除数据:
localStorage.removeItem("key");
也是键值对, 特点是关闭 App 就消失了, 也不能跨 webview, 一般不用于持久化数据保存。
保存数据:
sessionStorage.setItem("key", "value");
读取数据:
var lastname = sessionStorage.getItem("key");
删除数据:
sessionStorage.removeItem("key");
删除所有数据:
sessionStorage.clear();
体量最小, 可以设置过期时间。不能跨域。
保存数据:
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires;
}
读取数据:
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
}
return "";
}
uni.setStorage({
key: 'storage_key',
data: 'hello',
success: function () {
console.log('success');
}
});
try {
uni.setStorageSync('storage_key', 'hello');
} catch (e) {
// error
}
uni.getStorage({
key: 'storage_key',
success: function (res) {
console.log(res.data);
}
});
try {
const value = uni.getStorageSync('storage_key');
console.log(value);
} catch (e) {
// error
}
uni.setStorage({
key: 'storage_key',
data: 'hello',
success: function () {
console.log('success');
}
});
try {
uni.setStorageSync('storage_key', 'hello');
} catch (e) {
// error
}
uni.getStorage({
key: 'storage_key',
success: function (res) {
console.log(res.data);
}
});
try {
const value = uni.getStorageSync('storage_key');
console.log(value);
} catch (e) {
// error
}
OS 给原生 App 使用的键值对存储数据库封装一层给 JS 使用localstorage 还有一个特点是可跨域, 当一个存储数据, 需要被本地和来自服务器的页面同时读写时, 就涉及跨域问题, 此时 HTML5 的 localstorage 不能满足需求, 只能使用 plus.storageplus.storage 操作要比 localstorage 慢几十毫秒, 尤其是在循环里调用 plus api 会放大这种慢。
三方清理工具清理垃圾会不会造成某些数据丢失, 但丢失可能性是存在的, 虽然概率并不高, 取决于清理软件会不会分析你的存储数据里哪些是可以清除的垃圾数据。除了 OS 的清理工具外, 一般没有 root
权限的清理工具是拿不到除了plus.io 外的你的 app 的存储数据的。但 ios 上系统存储空间很少的时候, 系统会清理 cookie、localstorage、sessionstorage、websql、indexedDB 的数据, 此时使用 plus.storage、plus.sqllite 更安全。
// 清除所有存储数据
function clearStorage() {
plus.storage.clear();
}
// 异步清除存储数据
function clearAsync() {
plus.storage.clearAsync(function () {
console.log("clearAsync success");
}, function (e) {
console.log("clearAsync failed: " + JSON.stringify(e));
});
}
// 获取所有键名
function getAllKeys() {
var keys = plus.storage.getAllKeys();
console.log("keys length: " + keys.length);
}
// 异步获取所有键名
function getAllKeysAsync() {
plus.storage.getAllKeysAsync(function (e) {
var keys = e.keys;
console.log("keys length: " + keys.length);
},
function (e) {
console.log("clearAsync failed: " + JSON.stringify(e));
});
}
// 获取存储数据的个数
function storageCount() {
return plus.storage.getLength();
}
// 获取存储的键值
function getStorage() {
return plus.storage.getItem("test");
}
// 异步获取存储的键值
function getStorageAsync() {
plus.storage.getItemAsync("test", function (e) {
var data = e.data;
console.log("getItemAsync success: " + data);
}, function (e) {
console.log("getItemAsync failed: " + JSON.stringify(e));
});
}
// 获取键值对中指定索引值的key值
function enumValueByIndex() {
var keyNames = [];
var values = [];
var numKeys = plus.storage.getLength();
for (var i = 0; i < numKeys; i++) {
keyNames[i] = plus.storage.key(i);
values[i] = plus.storage.getItem(keyNames[i]);
}
}
// 修改或添加键值(key-value)对数据到应用数据存储中
function setStorage() {
plus.storage.setItem("test", "test with hbuilder!");
}
// 异步存储键值
function setStorageAsync() {
plus.storage.setItemAsync("test", "test with HBuilderX", function () {
console.log("setItemAsync success");
}, function (e) {
console.log("setItemAsync failed: " + JSON.stringify(e));
});
}
// 删除键值
function removeStorage() {
plus.storage.removeItem("test");
}
// 异步删除键值
function removeItemAsync() {
plus.storage.removeItemAsync("test", function () {
console.log("removeItemAsync success");
}, function (e) {
console.log("removeItemAsync failed: " + JSON.stringify(e));
});
}
同 -> App 端 -> 缓存 -> uni.storage
同 -> App 端 -> 缓存 -> plus.storage
plus.sqlite 是对原生的 sqlite 的封装。它也是一种可以通过 sql 在本地增删改查数据库的方案。
有点类似 websql, 但相对于 websql 而言, sqlite 的好处是:
app 里websql 可能会被清理, 而 sqlite 不会module.exports = {
dbName: 'chat', // 数据库名称
dbPath: '_doc/chat.db', // 数据库地址,推荐以下划线为开头 _doc/xxx.db
// 判断数据库是否打开
isOpen() {
// 数据库打开了就返回 true,否则返回 false
var open = plus.sqlite.isOpenDatabase({
name: this.dbName, // 数据库名称
path: this.dbPath // 数据库地址
})
return open;
},
// 创建数据库 或 有该数据库就打开
openSqlite() {
return new Promise((resolve, reject) => {
// 打开数据库
plus.sqlite.openDatabase({
name: this.dbName,
path: this.dbPath,
success(e) {
resolve(e); // 成功回调
},
fail(e) {
reject(e); // 失败回调
}
})
})
},
// 关闭数据库
closeSqlite() {
return new Promise((resolve, reject) => {
plus.sqlite.closeDatabase({
name: this.dbName,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
},
// 数据库建表 sql:'CREATE TABLE IF NOT EXISTS dbTable("id" varchar(50),"name" TEXT)
// 创建 CREATE TABLE IF NOT EXISTS 、 dbTable 是表名,不能用数字开头、括号里是表格的表头
createTable(dbTable, data) {
return new Promise((resolve, reject) => {
// executeSql: 执行增删改等操作的SQL语句
plus.sqlite.executeSql({
name: this.dbName,
sql: `CREATE TABLE IF NOT EXISTS ${dbTable}(${data})`,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
},
// 数据库删表 sql:'DROP TABLE dbTable'
dropTable(dbTable) {
return new Promise((resolve, reject) => {
plus.sqlite.executeSql({
name: this.dbName,
sql: `DROP TABLE ${dbTable}`,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
},
// 向表格里添加数据 sql:'INSERT INTO dbTable VALUES('x','x','x')' 对应新增
// 或者 sql:'INSERT INTO dbTable ('x','x','x') VALUES('x','x','x')' 具体新增
// 插入 INSERT INTO 、 dbTable 是表名、根据表头列名插入列值
insertTableData(dbTable, data, condition) {
// 判断有没有传参
if (dbTable !== undefined && data !== undefined) {
// 判断传的参是否有值
var bol = (JSON.stringify(data) == "{}");
if (!bol) {
if (condition == undefined) {
var sql = `INSERT INTO ${dbTable} VALUES('${data}')`;
} else {
var sql = `INSERT INTO ${dbTable} (${condition}) VALUES(${data})`;
}
// console.log(sql);
return new Promise((resolve, reject) => {
// 表格添加数据
plus.sqlite.executeSql({
name: this.dbName,
sql: sql,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
} else {
return new Promise((resolve, reject) => {
reject("错误添加")
})
}
} else {
return new Promise((resolve, reject) => {
reject("错误添加")
})
}
},
// 根据条件向表格里添加数据 有数据更新、无数据插入
// (建表时需要设置主键) 例如 --- "roomid" varchar(50) PRIMARY KEY
insertOrReplaceData(dbTable, data, condition) {
// 判断有没有传参
if (dbTable !== undefined && data !== undefined) {
if (condition == undefined) {
var sql = `INSERT OR REPLACE INTO ${dbTable} VALUES('${data}')`;
} else {
var sql = `INSERT OR REPLACE INTO ${dbTable} (${condition}) VALUES(${data})`;
}
// console.log(sql);
return new Promise((resolve, reject) => {
// 表格添加数据
plus.sqlite.executeSql({
name: this.dbName,
sql: sql,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
} else {
return new Promise((resolve, reject) => {
reject("错误添加")
})
}
},
// 查询获取数据库里的数据 sql:'SELECT * FROM dbTable WHERE lname = 'lvalue''
// 查询 SELECT * FROM 、 dbTable 是表名、 WHERE 查找条件 lname,lvalue 是查询条件的列名和列值
selectTableData(dbTable, lname, lvalue, cc, dd) {
if (dbTable !== undefined) {
// 第一个是表单名称,后两个参数是列表名,用来检索
if (lname !== undefined && cc !== undefined) {
// 两个检索条件
var sql = `SELECT * FROM ${dbTable} WHERE ${lname} = '${lvalue}' AND ${cc} = '${dd}'`;
}
if (lname !== undefined && cc == undefined) {
// 一个检索条件
var sql = `SELECT * FROM ${dbTable} WHERE ${lname} = '${lvalue}'`;
// console.log(sql);
}
if (lname == undefined) {
var sql = `SELECT * FROM ${dbTable}`;
}
return new Promise((resolve, reject) => {
// 表格查询数据 执行查询的SQL语句
plus.sqlite.selectSql({
name: this.dbName,
sql: sql,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
} else {
return new Promise((resolve, reject) => {
reject("错误查询")
});
}
},
// 删除表里的数据 sql:'DELETE FROM dbTable WHERE lname = 'lvalue''
// 删除 DELETE FROM 、 dbTable 是表名、 WHERE 查找条件 lname,lvalue 是查询条件的列名和列值
deleteTableData(dbTable, lname, lvalue, ww, ee) {
if (dbTable !== undefined) {
if (lname == undefined) {
var sql = `DELETE FROM ${dbTable}`;
} else {
if (ww !== undefined) {
// 两个检索条件
var sql = `DELETE FROM ${dbTable} WHERE ${lname} = '${lvalue}' AND ${ww} = '${ee}'`;
} else {
// 一个检索条件
var sql = `DELETE FROM ${dbTable} WHERE ${lname} = '${lvalue}'`;
}
}
return new Promise((resolve, reject) => {
// 删除表数据
plus.sqlite.executeSql({
name: this.dbName,
sql: sql,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
} else {
return new Promise((resolve, reject) => {
reject("错误删除")
});
}
},
// 修改数据表里的数据 sql:"UPDATE dbTable SET 列名 = '列值',列名 = '列值' WHERE lname = 'lvalue'"
// 修改 UPDATE 、 dbTable 是表名, data: 要修改的列名=修改后列值, lname,lvalue 是查询条件的列名和列值
updateTableData(dbTable, data, lname, lvalue) {
if (lname == undefined) {
var sql = `UPDATE ${dbTable} SET ${data}`;
} else {
var sql = `UPDATE ${dbTable} SET ${data} WHERE ${lname} = '${lvalue}'`;
}
// WHERE 前面是要修改的列名、列值,后面是条件的列名、列值
return new Promise((resolve, reject) => {
// 修改表数据
plus.sqlite.executeSql({
name: this.dbName,
sql: sql,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
},
// 获取指定数据条数 sql:"SELECT * FROM dbTable ORDER BY 'id' DESC LIMIT 15 OFFSET 'num'"
// dbTable 表名, ORDER BY 代表排序默认正序, id 是排序的条件 DESC 代表倒序,从最后一条数据开始拿
// LIMIT 15 OFFSET '${num}',这句的意思是跳过 num 条拿 15 条数据, num 为跳过多少条数据是动态值
// 例 初始num设为0,就从最后的数据开始拿15条,下次不拿刚获取的数据,所以可以让num为15,这样就能一步一步的拿完所有的数据
pullSQL(dbTable, id, num) {
return new Promise((resolve, reject) => {
plus.sqlite.selectSql({
name: this.dbName,
sql: `SELECT * FROM ${dbTable} ORDER BY '${id}' DESC LIMIT 15 OFFSET '${num}'`,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
}
}
plus.io 是文件读写, 虽然也可以通过读写 txt 等文件存储数据, 但并不如专业的 storage 和 websql 方便。
plus.io 更多的是用于图片等多媒体文件的本地保存。比如图文列表的离线使用, 一般有 2 种做法:
img 的 src, 而是 plus.dowload 下载的, 先下载图片, 存好路径后, 然后 img 的 src 动态指定文件路径img 的 src 下载, 然后用 canvas 把 img 存成图片文件, 下次不联网, img 的 scr 直接指向本地文件其他的一些下载文件的 API 也可以用作离线存储方案。