LeanCloud: 数据存储实现小程序云开发

news2024/11/24 0:53:37

1. LeanCloud 官网传送

2. LeanCloud选择原因

微信小程序的开发包括上线需要一个备案过的域名,而域名备案又需要一个服务器(仅腾讯云而言)。而微信云开发作为个人开发者受限于费用也不做考虑。

此时不考虑复杂的业务逻辑数据库读取是后端服务唯一的需求。经过一番搜索就发现了LeanCloud的数据存储很不错。点这里查看数据存储开发指南。

3. 初步了解

 数据存储中有个结构化数据,对应的一个概念就是Class(类似于关系型数据库中表)。

 和建表是比较相像的,稍微摸索就会操作。

4. 准备工作  SDK安装与初始化

5. 对象操作 传送门

这里的对象就是上面介绍过的Class,创建了一个对象之后就要有一些操作。

包括常规的数据库的增删查改。官网都是有示例的,如下图。

详情在传送门可以看到,就不过多赘述。

 6. 对象操作的二次封装

看过官网的示例就会发现数据操作在开发中是不能直接使用的,做一些简单的封装也是必要的。

以下附上我封装的方法,供参考(比较简单应该都能看懂,就只贴代码了)。

6.1 新增(保存)

// 封装leancloud保存对象的方法
const AV = require("../libs/av-core-min")
const Result = require("./result")

/**
 * 保存对象(重复数据不会覆盖)
 * @param {*} clazz 表名
 * @param {*} obj 保存对象的 k,v  
            * const obj = {
                key: 'name',
                value: '四宝'
              }
 */
const save = (clazz, obj) => {
  // 声明class
  const Clazz = AV.Object.extend(clazz)
  // 构建对象
  const cla = new Clazz();
  // 为属性赋值
  cla.set(obj.key, obj.value)
  // 将对象保存到云端
  cla.save().then((res) => {
    // 保存成功
    Result.ok()
  }, (err) => {
    // 异常处理
    Result.err(err)
  })
}

/**
 * 批量保存对象(重复数据不会覆盖)
 * @param {*} clazz 表名
 * @param {*} objs 保存对象的 k,v  
            * const objs = [
            *   {
            *     key: 'name',
                  value: '四宝'
                },
                {
            *     key: 'name',
                  value: '五宝'
                },
              ]
 */
const saveAll = (clazz, objs) => {
  // 声明class
  const Clazz = AV.Object.extend(clazz)
  
  // 为属性赋值
  var objects = []
  objs.forEach(obj => {
    // 构建对象
    const cla = new Clazz();
    cla.set(obj.key, obj.value)
    objects.push(cla)
  });
  console.log("saveAll, ", objects)
  // 批量更新
  AV.Object.saveAll(objects).then((res) => {
    // 保存成功
    Result.ok()
  }, (err) => {
    // 异常处理
    Result.err(err)
  })
}


module.exports = {
  save: save,
  saveAll: saveAll
}

6.2 查询

// 封装leancloud查询对象的方法
const AV = require("../libs/av-core-min")
const Result = require("./result")

/**
 * 查询对象
 * @param {*} clazz 表名
 * @param {*} objectId objectId
 */
const query = (clazz, objectId) => {
  const Clazz = new AV.Query(clazz)
  Clazz.get(objectId).then((res) => {
    // 查询成功
    console.log(res)
  }, (err) => {
    // 查询失败
    console.err(err)
  })
}

/**
 * 查询对象
 * @param {*} clazz 表名
 * @param {*} conditions 条件
            * const conditions = {
                key: 'name',
                value: '四宝'
              }
 */
const queryByCondition = (clazz, conditions) => {
  const Clazz = new AV.Query(clazz)
  Clazz.equalTo(conditions.key, conditions.value)
  Clazz.find().then((res) => {
    // 查询成功
    console.log(res)
  }, (err) => {
    // 查询失败
    console.err(err)
  })
}

module.exports = {
  query: query,
  queryByCondition: queryByCondition
}

6.3  修改

// 封装leancloud更新对象的方法
const AV = require("../libs/av-core-min")
const Result = require("./result")

/**
 * 更新对象
 * @param {*} clazz 表名
 * @param {*} objs 保存对象的 k,v  
            * const objs = [
            *   {
            *     key: 'name',
                  value: '四宝'
                },
                {
            *     key: 'name',
                  value: '五宝'
                },
              ]
 * @param {*} objectid objectid
 */
const update = (clazz, objs, objectid) => {
  const Clazz = AV.Object.createWithoutData(clazz, objectid);
  // 为属性赋值
  var objects = []
  objs.forEach(obj => {
    // 构建对象
    Clazz.set(obj.key, obj.value)
    objects.push(Clazz)
  });

  AV.Object.saveAll(objects).then((res) => {
    // 保存成功
    Result.ok()
  }, (err) => {
    // 异常处理
    Result.err(err)
  })
}

module.exports = {
  update: update
}

6.4 删除

// 封装leancloud删除对象的方法
const AV = require("../libs/av-core-min")
const Result = require("./result")

/**
 * 删除对象
 * @param {*} clazz 表名
 * @param {*} objectid objectid
 */
const destroy = (clazz, objectid) => {
  const Clazz = AV.Object.createWithoutData(clazz, objectid);
  Clazz.destroy().then((res) => {
    // 删除成功
    Result.ok()
  }, (err) => {
    // 删除处理
    Result.err(err)
  })
}

/**
 * 批量删除对象
 * @param {*} clazz 表名
 * @param {*} objectids objectids
 */
const destroyAll = (clazz, objectids) => {

  var objects = []
  objectids.forEach(objectid => {
    const Clazz = AV.Object.createWithoutData(clazz, objectid);
    objects.push(Clazz)
  });
  
  // 批量删除
  AV.Object.destroyAll(objects).then(
    function (res) {
      // 成功删除所有对象时进入此 resolve 函数,deletedObjects 是包含所有的 AV.Object 的数组
      Result.ok()
    },
    function (err) {
      // 只要有一个对象删除错误就会进入此 reject 函数
      Result.err(err)
    }
  );
}

module.exports = {
  destroy: destroy,
  destroyAll: destroyAll
}

6.5 Result

所有对象操作的结果都放到一个Result中了,包括数据对象的返回和成功/失败的消息提示。还没想好怎么去做就等用到的时候再去修改吧。

7. 写在最后

LeanCloud确实是个很不错的产品,对于个人开发者而言免费的功能和规格其实已经够用了。

我用到的包括云引擎都挺不错的,还有更多功能有待探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

A股、港股上市公司碳排放、碳强度和碳披露数据(2018-2021年)

随着中国碳强度减排任务的不断加重,当前政策的就业红利将不复存在,同时政策机制蕴含的资源错配、各行业边际减排成本不相等的问题则愈加严重,实施碳交易减排政策的时机逐渐成熟,政府应如何根据二氧化碳排放量、碳强度和碳披露等数…

带你走进Java字符串的小世界

目录 一. String 1. 什么是String 2. String常用构造器 3. 字符串的判断 4. 字符串的获取 5. 字符串的转换 6. 字符串比较和替换 7. 字符串的切割 二. StringBuffer与StringBuilder 2.1 关于StringBuffer 2.1.1 定义 2.1.2 构造方法 2.2 关于StringBuffer 三. StringJoiner的使…

分布式缓存的四大痛点

目前开发中经常用到的缓存,是我们必不可缺的,他大大的提高了我们整个项目的响应速度和并发量。但是带来好处的同时,也给我们带了了新的问题:缓存穿透、缓存击穿、缓存雪崩以及缓存一致性这么四个问题,也是分布式缓存的…

LeetCode算法之----动态规划

点赞收藏,以防遗忘 本文【程序大视界】已收录,关注免费领取互联网大厂学习资料,添加博主好友进群学习交流,欢迎留言和评论,一起交流共同进步。 目录 【一】前言 【二】打家劫舍 【三】不同路径 【四】最小路径和 …

【数据预处理】基于Kettle的字符串数据清洗、Kettle的字段清洗、Kettle的使用参照表集成数据

文章目录一.前言1.1 实验内容二.实验过程2.1 实验内容一:掌握基于Kettle的字符串数据清洗2.2 实验内容二:掌握基于Kettle的字段清洗2.3 实验内容三:掌握基于Kettle的使用参照表集成数据2.4 实验心得:一.前言 需要本文章的源文件下…

用零知识证明连接多链宇宙

目录 一、前言 二、Bridges和Zero Knowledge Proofs 三、Succinct Verification of Proof of Consensus (Succinct Labs)

【自然语言处理】【ChatGPT系列】ChatGPT的智能来自哪里?

相关博客 【自然语言处理】【ChatGPT系列】ChatGPT的智能来自哪里? 【自然语言处理】【ChatGPT系列】Chain of Thought:从大模型中引导出推理能力 【自然语言处理】【ChatGPT系列】InstructGPT:遵循人类反馈指令来训练语言模型 【自然语言处理…

二叉搜索树与Mysql索引的亲密关系

欢迎关注公众号:【离心计划】,一起逃离技术舒适圈 二叉搜索树 二叉搜索树大家应该多多少少听过,它有一个很重要的特征,就是父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值,这个…

详解vue中vuex的用法

前言 说到 vuex 相信大家都不陌生,vuex 是一个专为 vue.js 应用程序开发的状态管理模式。vuex 背后的基本思想,就是单向数据流。今天我们就来好好聊聊 vuex。 vuex? 用官方的话来说,vuex 是一个专为 vue.js 应用程序开发的状态管…

【Linux】进程间通信之共享内存与信号量初识

目录🌈前言🌸1、System V共享内存🍡1.1、概念🍢1.2、原理🌺2、共享内存相关函数和指令🍡2.1、shmget函数(创建)🍢2.2、shmctl函数(控制)&#x1f…

使用 DataAnnotations(数据注解)实现模型的通用数据校验

DataAnnotations 实现数据模型的通用校验参数校验的意义常用参数的校验.NET 中内置 DataAnnotations 提供的特性校验关于 DataAnnotations 中的特性介绍基于 DataAnnotations 的通用模型校验封装基于 DataAnnotations 的特性校验助手实现步骤如何使用 DataAnnotations 封装的特…

某农业学校 算法设计与分析-第五次实验-回溯算法

1. 罗密欧与朱丽叶的迷宫问题 问题描述 罗密欧与朱丽叶的迷宫。罗密欧与朱丽叶身处一个mn的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这mn个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿8 个方向进入未封闭的房间。罗…

第二章:关系数据库

一、关系数据库结构及形式化定义 1、【单选题】 下图中,关系D1、D2、D3笛卡尔积的目和基数分别为 正确答案: B 2、【多选题】下图中能够作为候选码的属性组为 正确答案: ABD 3、【多选题】关于关系数据库,说法正确的是 正确答…

二、栈和队列

二、栈和队列 栈——后进先出 应用:数制转换、括号匹配、行编辑程序、迷宫求解、表达式求值、八皇后问题、函数调用、递归调用的实现 队列——先进先出 应用:脱机打印输出 多用户系统用户排队分时循环使用CPU和主存 按用户优先级排队,每…

编译gtest报错‘is_trivially_copy_constructible’ is not a member of ‘std’

编译gtest报错‘is_trivially_copy_constructible’ is not a member of ‘std’一、问题描述二、原因分析三、升级gcc版本四、验证一、问题描述 在一个新的Redhat7.6 linux虚拟机上,将gtest clone下来之后编译,一堆报错: /opt/googletest/…

多线程问题(二)(安全问题)

目录 一、多线程不安全引例 二、线程不安全的原因 1、线程是抢占式执行 2、多线程共享同一变量 3、对变量的操作不是原子性 4、内存可见性 5、指令重排序 三、线程不安全问题的解决方案 1、使用synchronized关键字进行加锁 a、 synchronized修饰普通方法 b、sy…

Maleimide-PEG-Biotin,Biotin-PEG-MAL,生物素PEG马来酰亚胺用于生物分子检测

化学试剂生物素聚乙二醇马来酰亚胺,其英文名为Maleimide-PEG-Biotin,Biotin-PEG-MAL,它所属分类为Biotin PEG Multi-arm PEGs。 该试剂质量控制为95%,试剂的储存条件为: -20℃长期保存,避光,干…

数据结构---图

(一) 相关知识点 图(graph):图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中的顶点的集合,E是图G…

SpringBoot系列之自动装配原理详解

文章目录前言一、SpringBoot自动配置-Condition-11、观察spring自动创建bean过程2、创建自定义bean对象3、根据条件创建自定义bean二、 SpringBoot自动配置-Condition-2三、SpringBoot自动配置-切换内置web服务器1、查看继承关系图2、shiftdelete 排除Tomcat四、SpringBoot自动…

Win10启动Pycharm报错

Win10启动Pycharm报错报错信息解决方法报错信息 Internal error. Please report to http://jb.gg/ide/critical-startup-errors java.net.BindException: Address already in use: bind at java.base/sun.nio.ch.Net.bind0(Native Method) at java.base/sun.nio.ch.Net.bind(U…