注意: 看明白这篇文章的基础,是需要知道Titanium中基本的数据库操作. 见: http://docs.appcelerator.com/titanium/latest/#!/guide/Working_with_a_SQLite_Database-section-29004901_WorkingwithaSQLiteDatabase-CreatingandInstallingDatabases
refer to: http://docs.appcelerator.com/titanium/latest/#!/guide/Alloy_Sync_Adapters_and_Migrations
直接看如何使用(最头疼的地方)
先配置model:
// app/modes/book.js , 有两个列: title, id. 数据库中有18条记录
//migration, db_name, db_file 也是可以配置的
exports.definition = {
config: {
'columns': {
'title' : 'TEXT',
'id' : 'INTEGER PRIMARY KEY AUTOINCREMENT'
},
'adapter': {
'type': 'sql',
'collection_name': 'books',
'idAttribute': 'id',
//'migration': '20150404180000'
}
},
extendModel: function(Model){
_.extend(Model.prototype, {});
return Model;
},
extendCollection: function(Collection){
_.extend(Collection.prototype, {});
return Collection;
}
}
再配置 view: (很简单,务必建立一个 <Model /> 标签,否则 Alloy.Models 是空, 无法使用Alloy.createModel('book') )
<Alloy> <Model src='book' instance='true'/> <Window class="container"> ... </Alloy>
一旦配置好了之后, 这样用: ( 目前还不知道如何在controller中调用 sqlite中的数据)
// 假设数据库的表: books中有18个结果
my_book = Alloy.createModel('book')
my_book // 这时 这个变量啥内容也没有.
my_book.fetch()
my_book // fetch()之后, 返回18个结果
如果不用Model, 用Collection, 也可以查询:
books = Alloy.createCollection('book')
books // 啥也没有
books.fetch()
books // 结果就全出来了.
上面的看明白后,下面的基本不用看了 . 容易蒙, 而且没有成体系. 慎重!
Sync Adapter
就是存储的策略. 是通过web service 保存到远程的服务器,还是 保存到本地的数据库.(android, ios上的sqlite)
默认的情况是,Alloy 在创建model的时候,需要设置 Model.urlRoot 属性,或者 Collection.url. 然后Backbone会通过RESTful 的方式向远程服务器发送请求.
id 是主键. 跟MYSQL 中的id一样.
cid 是Backbone分配给某个model的临时id (client id) ,仅仅在 app运行时 有用.
下面的表格列出了 增删改查对应的 内容:
|
Backbone Method |
Sync CRUD Method |
Equivalent HTTP Method |
Equivalent SQL Method |
|
Collection.fetch |
read |
GET |
SELECT |
|
Collection.create (id == null) |
create |
POST |
INSERT |
|
Model.fetch |
read |
GET |
SELECT |
|
Model.save (id == null) |
create |
POST |
INSERT |
|
Model.destroy |
delete |
DELETE |
DELETE |
所以,下面代码可以清晰的看出, 某个方法(fetch, save) 对应的RESTful request:
// Since the urlRoot attribute is defined, all HTTP commands are to /library
// 思维注: 没有测试下一行代码,但是我估计 /library 应该不是完整的远程url, 是不是应该写成:
// http://api.ooxx.com/interface/library ?
var Book = Backbone.Model.extend({urlRoot:'/library'})
var book = new Book();
// Performs a POST on /library with the arguments as a payload and the server returns the id as 1
book.save({title:'Bossypants',author:'Tina Fey',checkout:false})
// Performs a GET on /library/1
book.fetch({id:1});
// Performs a PUT on /library/1 with the entire modified object as a payload.
book.save({checkout:true});
// Performs a DELETE on /library/1
book.destroy();
如何设置 Ti Model中的config ? (看里面的sync方式)?
1. sql: 保存在手机上的sqlite 数据库
2. properties: 保存在Titanium的环境中.
对应的sync 文件会被复制到: Resources/alloy/sync 中.
SQLite Adapter
几个例子:
var library = Alloy.createCollection('book');
// The table name is the same as the collection_name value from the 'config.adapter' object. This may be different from the model name.
var table = library.config.adapter.collection_name;
// use a simple query
library.fetch({query:'SELECT * from ' + table + ' where author="' + searchAuthor + '"'});
// or a prepared statement
library.fetch({query: { statement: 'SELECT * from ' + table + ' where author = ?', params: [searchAuthor] }});
下面两行代码是等价的
myModel.fetch({id: 123});
// is equivalent to
myModel.fetch({query: 'select * from ... where id = ' + 123 });
database migration ( 不建议使用 , 建议直接建立新的sqlite 数据库( 如: my_db_v1, my_db_v2)
migration 跟rails的一样, 仅仅在sql方式下生效,命名方式也跟rails的一样, 定义好两个方法: up, down
例子:
var preload_data = [
{title: 'english book'},
{title: 'math book'},
{title: 'chinese book'}
]
migration.up = function(migrator){
migrator.createTable( {
'columns': {
'title' : 'string'
}
})
for (var i = 0; i< preload_data.length; i++){
migrator.insertRow(preload_data[i]);
}
}
migration.down = function(migrator){
migrator.dropTable();
}
migrator 作为特殊的migration object, 有下列方法:
|
Key |
Description |
|
db |
Handle to a Ti.Database instance to interact with the SQLite database. Use this handle to execute SQL calls using db.execute. DO NOT CLOSE THIS HANDLE OR OPEN A SECOND INSTANCE OF THE DATABASE. This will cause fatal application errors. |
|
dbname |
Name of the database. |
|
table |
Name of the table. Same as value of the config.adapter.collection_name key of the Alloy Model file. |
|
idAttribute |
Name of the columns attribute to use as the primary key of the database. |
|
createTable |
Function to create a table in the database with the specified schema. Required parameter is the columns object from the configuration object of the Alloy Model file. |
|
dropTable |
Function to drop the current table from the database. |
|
insertRow |
Function to insert data into the table. Required parameter is a data object to insert in the table. Useful for preloading data. |
|
deleteRow |
Function to delete data from the table. Required parameter is a data object to remove from the table. Alloy uses an SQLite query based on the specified object to find the data to delete. |
migration会被自动执行到最新. 会在 app 启动时自动执行.
这里的官方文档没有说清楚, 尚未弄明白它是如何使用的. 所以不建议使用migration