我正在开发一个包含事件和任务的Titanium应用程序,我希望这些应用程序可以同步到云存储,这样用户就可以从任何应用程序或浏览器访问他们的事件和任务,只要他们提供登录。
似乎Appcelerator / Titanium使这一切变得非常简单,但它们在记录它时非常糟糕。也许我不明白。那么,任何人都可以确认或更正我在下面描绘的图片吗?
Titanium Alloy应用程序允许您通过在/ models文件夹中的JSON文件中定义模型来创建模型。如果为此对象指定属性,如下所示:adapter: {type:'acs'}
...那么只要在对象上调用.save()命令,Alloy就会将对象存储在ACS中。
为了使其正常工作,您当然必须让您的应用程序连接到ACS,您可以通过单击来完成 按钮"云启用"在tiapp.xml的图形界面中。当然,您必须确保应用程序使用特定的用户名 - 密码组合登录ACS。
如果我乐观地看待我的消息来源,这似乎就是你需要做的。这些来源是:
但后来我看到每个人都在引用Aaron Saunders的示例项目,其中有一些自定义文件似乎构建在Alloy之上,以便生成此适配器:{type:' acs'}事情可能。要查看我在说什么,请转到app / assets / alloy / sync文件夹并查看其中的acs.js文件。 此外,一年前Tony Lukasavage的问答答案说,目前没有合金的内置ACS同步适配器。他指出Aaron Saunders'项目http://alloylove.com/#寻求解决方案。
那是怎么回事?它确实都是内置于Alloy / Backbone并且没有记录在任何地方,Aaron Saunders使用内置的东西作为示例项目,还是我需要在我的项目中包含Aaron的代码才能使它全部工作?
感谢您的任何提示! Wytze
自我注意:也请尝试这个例子,这需要创建一个新项目:https://wiki.appcelerator.org/display/td/11.+Storing+data+in+ACS
答案 0 :(得分:3)
我已经掌握了Aaron Saunders' ACS同步。由于他的自述文件比我开始时有更多的先验知识,我想我会在这里放置自己的小手册以供将来参考。
首先,你需要了解第一个Backbone,然后是Alloy和Backbone的特定组合。 Backbone允许您执行面向对象的Javascript:如果您的应用程序完全与书籍相关,那么您可以定义书籍的外观。您可以将其称为类,但Backbone将其称为模型。不管。
基本上,Backbone将一个Javascript对象转换为模板(模型),您可以从中创建任意数量的特定实例。通过创建此模型的实例(也是Javascript对象),您可以为该对象提供一大堆功能,例如添加在对象的值以任何方式更改时触发的事件侦听器的选项。 / p>
创建Backbone模型及其实例
如果您不使用Alloy,创建Backbone模型的方法是:
var Book = Backbone.Model.extend({});
在此示例中,您根本不添加任何规范。所以" Book"创建的模板/模型获得了很多Backbone功能,比如添加事件监听器的选项,但没有自己定制的。
然后,使用new
关键字,您可以创建此模型的特定实例,即特定书籍。像:
var myNewBook = new Book({title:"Moby Dick"}};
合金模型:app / models中的文件
现在,Alloy的工作方式是在app / models文件夹中的特定文件中定义模型,文件的名称是模型的名称。因此,如果您想以Alloy方式创建Book模型,则应创建一个文件app / models / book.js,该文件应提供一个如下结构的导出(使用Book的概念作为示例):
exports.definition = {
config: {
columns: {
"title": "String",
"pages": "Number",
},
defaults: {
"title": "Default book title",
"pages": 0,
},
adapter: {
"type": "sql"
}
}
}
请注意,这是关于模型定义的最少的事情。和#34;适配器" bit是高度可选的:稍后会清楚我为什么要包含它。它的作用是指定Backbone应该将从该模型创建的Javascript对象(仅存储在内存中)同步到特定的数据存储。
您可能想要定义更多内容。事实上,如果你想进行Backbone / Alloy / ACS同步,你必须这样做。但首先,让我们尝试在Javascript中创建一个Backbone对象。
从Alloy模型创建Backbone对象
现在,每当您想要创建Book模型的实例时,您在代码中所做的只是使用Alloy.createModel
和正确的模型名称以及参数字典。像这样:
var oneBook = Alloy.createModel('Book',{title:"Moby Dick",pages:300});
Alloy将寻找' book.js'在app / models文件夹中的文件,使用那里定义的所有属性,并返回一个Backbone对象,其中包含一些Alloy bells和whistles。
(请注意,Alloy似乎对单词模型的含义感到有点困惑。你实际上并没有创建模型,而是模型的一个实例。或者我可能只是没有得到它)< / p>
ACS适配器
Aaron Saunders&#39;自动化合金/骨干对象同步的解决方案涉及调整Alloy使用骨干模型的方式。这就是为什么你需要在他的项目中包含至少两个文件才能使它全部工作的原因:
安装这些文件时会发生什么,因为Backbone同步功能现在可以使用名为&#39; acs&#39;的新适配器。
Backbone模型具有各种附加功能,包括将对象同步到数据存储(如SQLite数据库或localStorage)。此外,Backbone允许程序员创建&#34;适配器&#34;告诉它将数据同步到自定义数据存储。
Aaron Saunders&#39;解决方案将数据同步到ACS。通过将acs.js文件包含在适当的文件夹中,您可以确保Backbone / Alloy将使用该文件来组织同步。
hacky部分
因此,如果您已经定义了上面定义的Book模型,并且使用Alloy.createModel()在Javascript中创建Book,那么Alloy将查找book.js文件并将其用作模板它会添加您指定的自定义值(如标题)。
此外,由于acs.js适配器,它会自动将新对象踢到ACS。
也就是说,如果你帮忙一点,因为有一个hacky位有些可能会在以后清理,但现在仍然需要。这是:在模型定义中,您需要包含一个设置字典,其中包含两个重复对象名称的参数。 (是的,听起来很傻)
所以这是模型文件的完整示例:
exports.definition = {
config: {
columns: {
"title": "String",
"pages": "Number",
},
defaults: {
"title": "Default book title",
"pages": 0,
},
adapter: {
"type": "acs"
},
"settings": {
"object_name": "users",
"object_method": "Users"
}
}
}
总结 我希望这有助于明确Alloy如何在Backbone上构建以及Aaron Saunders如何构建在该组合之上。
我尚未自己回答的问题是:
当您从代码中的模型创建Backbone对象时,它会同步到ACS云。但是当你想让它走向另一个方向时,交通如何运作?如果云中的数据发生了变化怎么办?您将如何收到通知?你需要订阅吗?
应用离线时会发生什么?在应用重新联机之前,您的待处理数据是否已更改?如果应用程序在同步缓存数据之前关闭会发生什么?
答案 1 :(得分:0)
好的,所以我明白了。 &#34; easy&#34;所有你需要做的就是添加适配器:{type:&#39; acs&#39;}到你的对象定义,以便将它同步到ACS确实依赖于Aaron Saunders&#39;示例代码。他最好的解释是:https://github.com/aaronksaunders/ci.alloy.adapter.two
如果你想使用他的东西,基本上你只需要将他的项目中的两个文件复制到你自己的项目中: app / alloy.jmk(这会做一些我不完全理解的花哨的文件名重写) app / assets / alloy / sync / acs.js(这是他的东西的核心)
对我来说似乎很有希望,但是现在我想我将以自己的方式创建自己的对象,然后使用常规的Ti.Cloud方法将它们同步到ACS。