tx.Exporter = function(){ var lists = tx.data.conn.query('select * from list'); var doc = new runtime.flash.xml.XMLDocument(); var root = doc.createElement('simple-tasks'); doc.appendChild(root); root.attributes['version'] = '2.0'; for(var i = 0, len = lists.length; i < len; i++){ var list = lists[i]; var listNode = doc.createElement('list'); root.appendChild(listNode); for(var k in list){ if(list.hasOwnProperty(k)){ listNode.attributes[k] = String(list[k]); } } var tasks = tx.data.conn.queryBy('select * from task where listId = ?', [list.listId]); for(var j = 0, jlen = tasks.length; j < jlen; j++){ var task = tasks[j]; var taskNode = doc.createElement('task'); listNode.appendChild(taskNode); for(var t in task){ if(task.hasOwnProperty(t)){ taskNode.attributes[t] = String(task[t]); } } } } var file = new air.File(air.File.documentsDirectory.nativePath + air.File.separator + 'tasks.xml'); file.addEventListener('select', function(e){ var target = e.target; var stream = new air.FileStream(); stream.open(target, air.FileMode.WRITE); stream.writeUTFBytes(''); stream.writeUTFBytes(doc.toString()); stream.close(); }); // I wonder why no filter for Save As? // var filter = new air.FileFilter("Tasks XML File", "*.xml"); file.browseForSave('Save As'); };