code: function (xxx, results) {
                  var o
                  ,   r
                  ,   lookup = {}
                  // map from results to keys
                  for (var i = 0, l = results.rows.length; i < l; i++) {
  					var rowObj = results.rows.item(i);
                      o = JSON.parse(rowObj.value)
                      var row_key = rowObj.id;
                      lookup[row_key] = o;
                      try{row_key = JSON.parse(row_key);}catch(exc){}
                      //o.key = row_key;
                      o.timestamp = rowObj.timestamp;
                  }
                  r = args.map(function(row_key) {return lookup[row_key];});
                  if (!that.isArray(keyOrArray)) r = r.length ? r[0] : null
                  if (cb) that.lambda(cb).call(that, r)
              }
docs: FIXME will always loop the results but cleans it up if not a batch return at the end.. in other words, this could be faster