LeanCloud数据存储
数据存储(LeanStorage)是 LeanCloud 提供的核心功能之一,它的使用方法与传统的关系型数据库有诸多不同,下面我们将其与传统数据库的使用方法进行对比。
下面这条 SQL 语句在绝大数的关系型数据库都可以执行,其结果是在 Todo 表里增加一条新数据:
INSERT INTO Todo (title, content) VALUES ('工程师周会', '每周工程师会议,周一下午 2 点')
使用传统的关系型数据库作为应用的数据源几乎无法避免以下步骤:
- 插入数据之前一定要先创建一个表结构,并且随着之后需求的变化,开发者需要不停地修改数据库的表结构,维护表数据。
- 每次插入数据的时候,客户端都需要连接数据库来执行数据的增删改查(CRUD)操作。 使用 LeanStorage,实现代码如下:
// 声明一个 Todo 类型 var Todo = AV.Object.extend('Todo'); // 新建一个 Todo 对象 var todo = new Todo(); todo.set('title', '工程师周会'); todo.set('content', '每周工程师会议,周一下午2点'); todo.save().then(function (todo) { // 成功保存之后,执行其他逻辑. console.log('New object created with objectId: ' + todo.id); }, function (error) { // 失败之后执行其他逻辑 console.log('Failed to create new object, with error message: ' + error.message); });
使用 LeanStorage 的特点在于:
- 不需要单独维护表结构。例如,为上面的 Todo 表新增一个
location
字段,用来表示日程安排的地点,那么刚才的代码只需做如下变动:var Todo = AV.Object.extend('Todo'); var todo = new Todo(); todo.set('title', '工程师周会'); todo.set('content', '每周工程师会议,周一下午2点'); // 只要添加这一行代码,服务端就会自动添加这个字段 todo.set('location','会议室'); todo.save().then(function (todo) { // 成功保存之后,执行其他逻辑. }, function (error) { // 失败之后执行其他逻辑 });
- 数据可以随用随加,这是一种无模式化(Schema Free)的存储方式。
- 所有对数据的操作请求都通过 HTTPS 访问标准的 REST API 来实现。
- 我们为各个平台或者语言开发的 SDK 在底层都是调用统一的 REST API,并提供完整的接口对数据进行增删改查。
LeanStorage 在结构化数据存储方面,与 DB 的区别在于:
1.Schema Free/Not free 的差异
2.数据接口上,LeanStorage 是面向对象的(数据操作接口都是基于 Object 的),开放的(所有移动端都可以直接访问),DB 是面向结构的,封闭的(一般在 Server 内部访问);
3.数据之间关联的方式,DB 是主键外键模型,LeanStorage 则有自己的关系模型(Pointer、Relation 等);
LeanStorage 支持两种存储类型: 对象和文件
下面主要说一下如何存储对象,代码如下:
// 该语句应该只声明一次 var TestObject = AV.Object.extend('DataTypeTest'); var number = 2014; var string = 'famous film name is ' + number; var date = new Date(); var array = [string, number]; var object = { number: number, string: string }; var testObject = new TestObject(); testObject.set('testNumber', number); testObject.set('testString', string); testObject.set('testDate', date); testObject.set('testArray', array); testObject.set('testObject', object); testObject.set('testNull', null); testObject.save().then(function(testObject) { // 成功 }, function(error) { // 失败 });
现在我们保存一个TodoFolder,它可以包含多个 Todo,类似于给行程按文件夹的方式分组。我们并不需要提前去后台创建这个名为TodoFolder 的 Class 类,而仅需要执行如下代码,云端就会自动创建这个类:
// 声明类型 var TodoFolder = AV.Object.extend('TodoFolder'); // 新建对象 var todoFolder = new TodoFolder(); // 设置名称 todoFolder.set('name','工作'); // 设置优先级 todoFolder.set('priority',1); todoFolder.save().then(function (todo) { console.log('objectId is ' + todo.id); }, function (error) { console.log(error); });
创建完成后,打开 控制台 > 存储,点开 TodoFolder
类,就可以看到刚才添加的数据。除了 name、priority(优先级)之外,其他字段都是数据表的内置属性。
注意:
属性名:
也叫键或 key,必须是由字母、数字或下划线组成的字符串;自定义的属性名,不能以双下划线开头。
属性值:
可以是字符串、数字、布尔值、数组或字典。
以下为系统保留字段,不能作为属性名来使用。 acl error pendingKeys ACL fetchWhenSave running className id updatedAt code isDataReady uuid createdAt keyValues description objectId
提高代码的可读性和可维护性,建议使用驼峰式命名法(CamelCase)为类和属性来取名。类,采用大驼峰法,如CustomData. 属性,采用小驼峰法,如 imageUrl.
注意在测试之前要把下面这行代码加入到你的index.html页面中:
<script src="http://cdn1.lncld.net/static/js/av-min-1.2.1.js"></script>
下载到本地直接引用也可以,我是下载本地放到lib文件中按下面方式直接引用的:
<script src="../lib/av-min-1.2.1.js"></script>
进行代码初始化后加入这行代码,就可以创建 class 或任何其他操作了。创建应用后, 可以在 控制台-应用设置 里面找到应用对应的 appId 和 appKey。然后在路由文件中添加如下代码进行初始化:
app.run(function(){ //应用ID用来识别应用 var APP_ID = 'RaXOd37qSYs8fKCN82nbC9zd-gzGzoHsz'; //应用Key,用来校验权限(Web端可以配置安全域名来保护数据安全) var APP_KEY = 'SMJDrjpJOmuyEuTXjm5lW2BM'; //初始化 AV.init({ appId: APP_ID, appKey: APP_KEY })});