当前位置:   article > 正文

uniapp安卓端使用SQLite保存网络文件至本地_uniapp 换机 sqllite迁移数据

uniapp 换机 sqllite迁移数据

开发环境:uniapp框架、vue2、安卓端

1、uniapp点击manifest.json,APP模块配置开启SQlite模块


2、 utils文件夹中创建sqlite.js文件

  1. module.exports = {
  2. dbName: 'advs', // 数据库名称
  3. dbPath: '_doc/advs.db', // 数据库地址,推荐以下划线为开头 _doc/xxx.db
  4. // 判断数据库是否打开
  5. isOpen() {
  6. // 数据库打开了就返回 true,否则返回 false
  7. var open = plus.sqlite.isOpenDatabase({
  8. name: this.dbName, // 数据库名称
  9. path: this.dbPath // 数据库地址
  10. })
  11. return open;
  12. },
  13. // 创建数据库 或 有该数据库就打开
  14. openSqlite() {
  15. return new Promise((resolve, reject) => {
  16. // 打开数据库
  17. plus.sqlite.openDatabase({
  18. name: this.dbName,
  19. path: this.dbPath,
  20. success(e) {
  21. resolve(e); // 成功回调
  22. },
  23. fail(e) {
  24. reject(e); // 失败回调
  25. }
  26. })
  27. })
  28. },
  29. // 关闭数据库
  30. closeSqlite() {
  31. return new Promise((resolve, reject) => {
  32. plus.sqlite.closeDatabase({
  33. name: this.dbName,
  34. success(e) {
  35. resolve(e);
  36. },
  37. fail(e) {
  38. reject(e);
  39. }
  40. })
  41. })
  42. },
  43. // 数据库建表 sql:'CREATE TABLE IF NOT EXISTS dbTable("id" varchar(50),"name" TEXT)
  44. // 创建 CREATE TABLE IF NOT EXISTS 、 dbTable 是表名,不能用数字开头、括号里是表格的表头
  45. createTable(dbTable, data) {
  46. return new Promise((resolve, reject) => {
  47. // executeSql: 执行增删改等操作的SQL语句
  48. plus.sqlite.executeSql({
  49. name: this.dbName,
  50. sql: `CREATE TABLE IF NOT EXISTS ${dbTable}(${data})`,
  51. success(e) {
  52. resolve(e);
  53. },
  54. fail(e) {
  55. reject(e);
  56. }
  57. })
  58. })
  59. },
  60. // 数据库删表 sql:'DROP TABLE dbTable'
  61. dropTable(dbTable) {
  62. return new Promise((resolve, reject) => {
  63. plus.sqlite.executeSql({
  64. name: this.dbName,
  65. sql: `DROP TABLE ${dbTable}`,
  66. success(e) {
  67. resolve(e);
  68. },
  69. fail(e) {
  70. reject(e);
  71. }
  72. })
  73. })
  74. },
  75. // 向表格里添加数据 sql:'INSERT INTO dbTable VALUES('x','x','x')' 对应新增
  76. // 或者 sql:'INSERT INTO dbTable ('x','x','x') VALUES('x','x','x')' 具体新增
  77. // 插入 INSERT INTO 、 dbTable 是表名、根据表头列名插入列值
  78. insertTableData(dbTable, data, condition) {
  79. // 判断有没有传参
  80. if (dbTable !== undefined && data !== undefined) {
  81. // 判断传的参是否有值
  82. var bol = (JSON.stringify(data) == "{}");
  83. if (!bol) {
  84. if (condition == undefined) {
  85. var sql = `INSERT INTO ${dbTable} VALUES('${data}')`;
  86. } else {
  87. var sql = `INSERT INTO ${dbTable} (${condition}) VALUES(${data})`;
  88. }
  89. // console.log(sql);
  90. return new Promise((resolve, reject) => {
  91. // 表格添加数据
  92. plus.sqlite.executeSql({
  93. name: this.dbName,
  94. sql: sql,
  95. success(e) {
  96. resolve(e);
  97. },
  98. fail(e) {
  99. reject(e);
  100. }
  101. })
  102. })
  103. } else {
  104. return new Promise((resolve, reject) => { reject("错误添加") })
  105. }
  106. } else {
  107. return new Promise((resolve, reject) => { reject("错误添加") })
  108. }
  109. },
  110. // 根据条件向表格里添加数据 有数据更新、无数据插入
  111. // (建表时需要设置主键) 例如 --- "roomid" varchar(50) PRIMARY KEY
  112. insertOrReplaceData(dbTable, data, condition) {
  113. // 判断有没有传参
  114. if (dbTable !== undefined && data !== undefined) {
  115. if (condition == undefined) {
  116. var sql = `INSERT OR REPLACE INTO ${dbTable} VALUES('${data}')`;
  117. } else {
  118. var sql = `INSERT OR REPLACE INTO ${dbTable} (${condition}) VALUES(${data})`;
  119. }
  120. // console.log(sql);
  121. return new Promise((resolve, reject) => {
  122. // 表格添加数据
  123. plus.sqlite.executeSql({
  124. name: this.dbName,
  125. sql: sql,
  126. success(e) {
  127. resolve(e);
  128. },
  129. fail(e) {
  130. reject(e);
  131. }
  132. })
  133. })
  134. } else {
  135. return new Promise((resolve, reject) => { reject("错误添加") })
  136. }
  137. },
  138. // 查询获取数据库里的数据 sql:'SELECT * FROM dbTable WHERE lname = 'lvalue''
  139. // 查询 SELECT * FROM 、 dbTable 是表名、 WHERE 查找条件 lname,lvalue 是查询条件的列名和列值
  140. selectTableData(dbTable, lname, lvalue, cc, dd) {
  141. if (dbTable !== undefined) {
  142. // 第一个是表单名称,后两个参数是列表名,用来检索
  143. if (lname !== undefined && cc !== undefined) {
  144. // 两个检索条件
  145. var sql = `SELECT * FROM ${dbTable} WHERE ${lname} = '${lvalue}' AND ${cc} = '${dd}'`;
  146. }
  147. if (lname !== undefined && cc == undefined) {
  148. // 一个检索条件
  149. var sql = `SELECT * FROM ${dbTable} WHERE ${lname} = '${lvalue}'`;
  150. // console.log(sql);
  151. }
  152. if (lname == undefined) {
  153. var sql = `SELECT * FROM ${dbTable}`;
  154. }
  155. return new Promise((resolve, reject) => {
  156. // 表格查询数据 执行查询的SQL语句
  157. plus.sqlite.selectSql({
  158. name: this.dbName,
  159. sql: sql,
  160. success(e) {
  161. resolve(e);
  162. },
  163. fail(e) {
  164. reject(e);
  165. }
  166. })
  167. })
  168. } else {
  169. return new Promise((resolve, reject) => { reject("错误查询") });
  170. }
  171. },
  172. // 删除表里的数据 sql:'DELETE FROM dbTable WHERE lname = 'lvalue''
  173. // 删除 DELETE FROM 、 dbTable 是表名、 WHERE 查找条件 lname,lvalue 是查询条件的列名和列值
  174. deleteTableData(dbTable, lname, lvalue, ww, ee) {
  175. if (dbTable !== undefined) {
  176. if (lname == undefined) {
  177. var sql = `DELETE FROM ${dbTable}`;
  178. } else {
  179. if (ww !== undefined) {
  180. // 两个检索条件
  181. var sql = `DELETE FROM ${dbTable} WHERE ${lname} = '${lvalue}' AND ${ww} = '${ee}'`;
  182. } else {
  183. // 一个检索条件
  184. var sql = `DELETE FROM ${dbTable} WHERE ${lname} = '${lvalue}'`;
  185. }
  186. }
  187. return new Promise((resolve, reject) => {
  188. // 删除表数据
  189. plus.sqlite.executeSql({
  190. name: this.dbName,
  191. sql: sql,
  192. success(e) {
  193. resolve(e);
  194. },
  195. fail(e) {
  196. reject(e);
  197. }
  198. })
  199. })
  200. } else {
  201. return new Promise((resolve, reject) => { reject("错误删除") });
  202. }
  203. },
  204. // 修改数据表里的数据 sql:"UPDATE dbTable SET 列名 = '列值',列名 = '列值' WHERE lname = 'lvalue'"
  205. // 修改 UPDATE 、 dbTable 是表名, data: 要修改的列名=修改后列值, lname,lvalue 是查询条件的列名和列值
  206. updateTableData(dbTable, data, lname, lvalue) {
  207. if (lname == undefined) {
  208. var sql = `UPDATE ${dbTable} SET ${data}`;
  209. } else {
  210. var sql = `UPDATE ${dbTable} SET ${data} WHERE ${lname} = '${lvalue}'`;
  211. }
  212. // WHERE 前面是要修改的列名、列值,后面是条件的列名、列值
  213. return new Promise((resolve, reject) => {
  214. // 修改表数据
  215. plus.sqlite.executeSql({
  216. name: this.dbName,
  217. sql: sql,
  218. success(e) {
  219. resolve(e);
  220. },
  221. fail(e) {
  222. reject(e);
  223. }
  224. })
  225. })
  226. },
  227. // 获取指定数据条数 sql:"SELECT * FROM dbTable ORDER BY 'id' DESC LIMIT 15 OFFSET 'num'"
  228. // dbTable 表名, ORDER BY 代表排序默认正序, id 是排序的条件 DESC 代表倒序,从最后一条数据开始拿
  229. // LIMIT 15 OFFSET '${num}',这句的意思是跳过 num 条拿 15 条数据, num 为跳过多少条数据是动态值
  230. // 例 初始num设为0,就从最后的数据开始拿15条,下次不拿刚获取的数据,所以可以让num为15,这样就能一步一步的拿完所有的数据
  231. pullSQL(dbTable, id, num) {
  232. return new Promise((resolve, reject) => {
  233. plus.sqlite.selectSql({
  234. name: this.dbName,
  235. sql: `SELECT * FROM ${dbTable} ORDER BY '${id}' DESC LIMIT 15 OFFSET '${num}'`,
  236. success(e) {
  237. resolve(e);
  238. },
  239. fail(e) {
  240. reject(e);
  241. }
  242. })
  243. })
  244. }
  245. }

3、在需要使用sqlite的vue中引入js文件   

import DB from "../../utils/sqlite.js"

4、vue methods方法中编写方法

我创建的数据表结构:id 、network_path(网络地址)、local_path(本地地址)

  1. onLoad()
  2. {
  3. //#ifdef APP-PLUS
  4. this.openSQL()
  5. //#endif
  6. },
  7. methods: {
  8. //#ifdef APP-PLUS
  9. // -----------------------------------------数据库 start-----------------------------------------
  10. // 打开数据库
  11. openSQL()
  12. {
  13. // 这个是查询有没有打开数据库
  14. let open = DB.isOpen();
  15. console.log("数据库状态", open ? "开启" : "关闭");
  16. if (!open) {
  17. DB.openSqlite()
  18. .then(res => {
  19. console.log("数据库已打开");
  20. this.createTable()
  21. })
  22. .catch(error => {
  23. console.log("数据库开启失败");
  24. });
  25. }
  26. },
  27. // 创建表
  28. createTable()
  29. {
  30. let open = DB.isOpen();
  31. if (open) {
  32. // DB.deleteTableData('advs')
  33. this.openSQL();
  34. let sql = '"id" INTEGER PRIMARY KEY AUTOINCREMENT,"network_path" varchar,"local_path" varchar';
  35. // "key" varchar,
  36. // 创建表 DB.createTable(表名, 表的列)
  37. DB.createTable("advs", sql)
  38. .then(res => {
  39. console.log("创建advs表成功");
  40. })
  41. .catch(error => {
  42. console.log("创建表失败");
  43. });
  44. } else {
  45. console.log("数据库未打开");
  46. }
  47. },
  48. // -----------------------------------------数据库 end-----------------------------------------
  49. //#endif
  50. }

5、vue methods方法中编写储存方法

传入data数据,data数据格式为网络地址的一维数组 ['网络地址1','网络地址2']

  1. // 新增表数据 并且 将网络文件缓存本地
  2. insertTableData(data){
  3. return new Promise((resolve, reject) => {
  4. let open = DB.isOpen();
  5. if (open) {
  6. var insertData = Promise.all(data.map((value) => {
  7. new Promise((resolve, reject) => {
  8. DB.selectTableData("advs", "network_path", value)
  9. .then(res => {
  10. if (typeof (res[0]) !== 'undefined') {
  11. reject('数据已存在')
  12. } else {
  13. resolve('可以新增数据')
  14. }
  15. })
  16. .catch(error => {
  17. resolve('不存在')
  18. });
  19. }).then(res => {
  20. //这步downloadFile是下载文件到本地,但是读取不到,需要再执行下边的saveImageToPhotosAlbum存到图库中
  21. return new Promise((resolve, reject) => {
  22. uni.downloadFile({
  23. url: value,
  24. success(res1) {
  25. resolve(res1.tempFilePath)
  26. },
  27. })
  28. })
  29. }).then(res => {
  30. //存到图库中,可以读取到文件了 res1.path 就是本地图库的文件地址
  31. return new Promise((resolve, reject) => {
  32. uni.saveImageToPhotosAlbum({
  33. filePath: res,
  34. success: (res1) => {
  35. resolve(res1.path)
  36. }
  37. })
  38. })
  39. }).then(res => {
  40. return new Promise((resolve, reject) => {
  41. let sql =
  42. `'${value}','${res}'`;
  43. let condition = "'network_path','local_path'";
  44. // 新增 DB.insertTableData(表名, 对应表头列的数据)
  45. DB.insertTableData("advs", sql, condition)
  46. .then(res => {
  47. resolve("新增数据成功");
  48. })
  49. .catch(error => {
  50. console.log(error)
  51. resolve("新增数据失败");
  52. });
  53. })
  54. }).then(res => {
  55. console.log(res)
  56. return res
  57. })
  58. })).then(() => {
  59. resolve('成功')
  60. })
  61. } else {
  62. reject("数据库未打开");
  63. console.log("数据库未打开");
  64. }
  65. })
  66. }

或者说直接传单个文件地址

  1. // 新增表数据 并且 将网络文件缓存本地
  2. // data:文件的网络地址
  3. insertTableData(data)
  4. {
  5. let open = DB.isOpen();
  6. if (open) {
  7. new Promise((resolve, reject) => {
  8. DB.selectTableData("advs", "network_path", data)
  9. .then(res => {
  10. if (typeof (res[0]) !== 'undefined') {
  11. reject('数据已存在')
  12. } else {
  13. resolve('可以新增数据')
  14. }
  15. })
  16. .catch(error => {
  17. resolve('不存在')
  18. });
  19. }).then(res => {
  20. //这步downloadFile是下载文件到本地,但是读取不到,需要再执行下边的saveImageToPhotosAlbum存到图库中
  21. return new Promise((resolve, reject) => {
  22. uni.downloadFile({
  23. url: data,
  24. success(res1) {
  25. resolve(res1.tempFilePath)
  26. },
  27. })
  28. })
  29. }).then(res => {
  30. //存到图库中,可以读取到文件了 res1.path 就是本地图库的文件地址
  31. return new Promise((resolve, reject) => {
  32. uni.saveImageToPhotosAlbum({
  33. filePath: res,
  34. success: (res1) => {
  35. resolve(res1.path)
  36. }
  37. })
  38. })
  39. }).then(res => {
  40. return new Promise((resolve, reject) => {
  41. let sql =
  42. `'${data}','${res}'`;
  43. let condition = "'network_path','local_path'";
  44. // 新增 DB.insertTableData(表名, 对应表头列的数据)
  45. DB.insertTableData("advs", sql, condition)
  46. .then(res => {
  47. resolve("新增数据成功");
  48. })
  49. .catch(error => {
  50. console.log(error)
  51. resolve("新增数据失败");
  52. });
  53. })
  54. }).then(res => {
  55. console.log(res)
  56. return res
  57. })
  58. }
  59. }


6、在需要使用地址的地方编写以下方法

  1. //生命周期 - 创建完成(可以访问当前this实例)
  2. created() {
  3. //#ifdef APP-PLUS
  4. DB.selectTableData("advs","network_path",'你的网络地址')
  5. .then(res => {
  6. if (res) {
  7. //如果数据库中可以查到数据,src 就用本地缓存的地址
  8. this.src = res[0].local_path
  9. }
  10. })
  11. .catch(error => {
  12. //如果数据库中查不到数据,src 就用网络地址
  13. this.src = '你的网络地址'
  14. });
  15. // #endif
  16. },

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/267236
推荐阅读
相关标签
  

闽ICP备14008679号