注意: 看明白这篇文章的基础,是需要知道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