【微信小程序】用文件读写实现数据库的增删改查

发布于:2022-12-10 ⋅ 阅读:(755) ⋅ 点赞:(0)

一,背景

上个月微信小程序给开发者推送消息,告知云开发即将开始收费模式,开始几个月19.9元/月,后面恢复到原价39/月,这还是基础套餐价格,听到这个消息,作为个人开发者肯定不会再继续用云开发了,于是想到转换数据存储的地方,比如说存到阿里云、存到个人独立服务器,最后想到一个简单可行的方法,存文件,只做本地使用。
在这里插入图片描述
在这里插入图片描述

二,代码实现

在这里插入图片描述
主要就是把原来云开发中用到数据库和云函数改转移成文件独写方式

1,基本配置

在app.js中添加一个全局常量,就是文件的存放路径,USER_DATA_PATH这个路径是系统路径,可以直接用

//app.js
App({
  onLaunch: function () {
   	this.globalData = {
   		payFile:`${wx.env.USER_DATA_PATH}/pay.txt`
   	}
   }
})

2,增、改

使用JSON.parse方法把读取来的字符串转成json
通过id判断传过来的是新增还是修改
调用findIndex方法找到id在读取的数组中的索引
调用splice方法来替换修改数据
调用push方法来新增数据

// 文件读写操作
     var self = this
     const fs = wx.getFileSystemManager()
     // 先读文件
     fs.readFile({
      filePath: app.globalData.payFile,
      encoding: 'utf8',
      position: 0,
      success(res) {
        var fileId = null
        if(self.data.dataId != ''){
        // 修改
          fileId = self.data.dataId
        }else{
        // 新增
          fileId = util.wxuuid()
        }
        var pp = {
          _id: fileId,
          date: self.data.curDate.substring(8,10),
          yymm: self.data.curDate.substring(0, 7),
          category: parseInt(self.data.index),
          mark: self.data.mark,
          paytype: parseInt(self.data.pindex),
          money: parseInt(self.data.money),
          createtime: util.formatTime(new Date())
        }
        let result = JSON.parse(res.data)
         // 按日期倒序
        result.sort((a,b) => {return b.date - a.date})
        // 如果dataId不为空,说明是修改数据
        if(self.data.dataId != ''){
          const val1 = result.findIndex(x => x._id === fileId)
          result.splice(val1,1,pp)
        }else{
          result.push(pp)
        }
        self.updateFile(result)
     },
      fail(res) {
        console.error(res)
      }
    })
	// 修改或新增数据
  updateFile: function(result){
     const fs = wx.getFileSystemManager()
      fs.writeFile({
       filePath: app.globalData.payFile,
       data: JSON.stringify(result),
       encoding: 'utf8',
       success(res) {
        wx.navigateBack({
          delta: 1
        })
       },
       fail(res) {
         console.error(res)
       }
     })
  },

3,删

总体逻辑和上一步增改差不多:
使用JSON.parse方法把读取来的字符串转成json
调用sort方法先排序,排序规则和列表一样,免得删错位置
调用findIndex方法找到id在读取的数组中的索引
调用splice方法来删除数据

 const fs = wx.getFileSystemManager()
                // 先读文件
                fs.readFile({
                 filePath: app.globalData.payFile,
                 encoding: 'utf8',
                 position: 0,
                 success(res) {
                  let result = JSON.parse(res.data)
                  // 按日期倒序
                  result.sort((a,b) => {return b.date - a.date})
                  // 根据id找到数据在result中的索引位置
                  const val1 = result.findIndex(x => x._id === self.data.holidays[e.currentTarget.dataset.index]._id)
                  result.splice(val1,1)
                  self.updateFile(result,self)
                },
                 fail(res) {
                   console.error(res)
                 }
               })
  updateFile: function(result,self){
   const fs = wx.getFileSystemManager()
    fs.writeFile({
     filePath: app.globalData.payFile,
     data: JSON.stringify(result),
     encoding: 'utf8',
     success(res) {
       console.log('wirteFile success')
       wx.showToast({
          title: '删除成功',
        })
        // 更新当前界面
        self.onShow()
     },
     fail(res) {
       console.error(res)
     }
   })
},

4,查

使用JSON.parse方法把读取来的字符串转成json
使用filter方法过滤出当月数据
使用sort方法对数据排序
最后把数据setData

const app = getApp()
 const fs = wx.getFileSystemManager()
    fs.readFile({
      filePath: app.globalData.payFile,
      encoding: 'utf8',
      position: 0,
      success(res) {
        let result = JSON.parse(res.data)
        // 过滤出当月数据
        const newArr = result.filter(val => val.yymm == yyyymm)
        // 按日期倒序
        newArr.sort((a,b) => {return b.date - a.date})
        console.log(newArr)

        self.setData({
          holidays: newArr,
          totalprice: self.onSum(newArr),
          isFirst: false
        })
     },
      fail(res) {
        console.error(res)
      }
    })

三,后续

不知道这样改了以后会不会有问题,咱们拭目以待吧
1,小程序审核能不能正常通过
2,10.20后小程序能不能正常使用

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到