Sencha Touch同步并从服务器获取新数据

时间:2012-03-07 09:30:54

标签: sencha-touch store sync overwrite

我的应用是需要填写的待办事项表格列表。

  1. 当应用程序打开时,它会进入服务器并从(数据库中)收集要完成的表单列表。
  2. 当您单击表单时,您可以填写数据(使用LocalStorage代理),然后保存/更新数据。数据本地存储在设备上。
  3. 截至目前:当我再次打开应用程序时,它会收集相同的ToDo列表并使用新的空表单覆盖LocalStorage中的数据(即我填写的表单),因此我需要再次填写它们。

    我想要的是:我不需要覆盖已填写的表格,而只需收集那些尚未在我的本地存储中的表格。

    我的代码: 店铺: - 代码:

    FMS.stores.onlineTodo =  new Ext.data.Store({
    model: 'ToDoMod',
    proxy: {
        id : 'fmsonlinetodo',
        type: 'ajax',
        url: 'app/data/dummydata.json',
        reader: new Ext.data.JsonReader({
            root: 'items'
        }),
        timeout: 2000,
        listeners: {
            exception:function () {
                console.log("I think we are offline");
                flagoffline = 1;
    //              
            }
        }
     }
    });
    
    FMS.stores.offlineTodo = new Ext.data.Store({
    model : 'ToDoMod',
    proxy : {
        type : 'localstorage',
        id : 'fmsofflinetodo'
    }
    });
    

    将数据加载到商店的控制器功能:

    代码:

    loadDataInitial : function(){
    
        FMS.stores.onlineTodo.addListener('load', function () {
            console.log("I think we are online");
            FMS.stores.offlineTodo.proxy.clear();
            FMS.stores.onlineTodo.each(function (record) {                         
                  FMS.stores.offlineTodo.add(record.data)[0];
            });
            FMS.stores.offlineTodo.sync();
            FMS.stores.offlineTodo.load();
            flagoffline = 0;
        });
    
        if(flagoffline == 0){
            FMS.stores.onlineTodo.load();
        }
        else{
            FMS.stores.offlineTodo.load();
        }
    
    
    },
    

    帮助!!!!!

2 个答案:

答案 0 :(得分:0)

如果我没弄错的话,你在使用它时清除所有的localStorage记录:

FMS.stores.offlineTodo.proxy.clear();

您要做的是使用在线商店收集所有数据库记录,然后为每条记录查询同一记录的本地存储,如果存在,请不要更新它。

基本上是版本控制方法,但绝对不清除商店,你将删除其中的所有内容!

更新:

以下是一些示例代码:

//load remotestore
remoteStore.load({
    scope: this,
    callback: function (records, operation, success) {
        //get record count
        var localCount = localStore.getCount();

        if (localCount == 0) {
            //iterate each record in remotestore
            remoteStore.each(function (record) {
                //add record to localStorage
                localStore.add(record.copy());
            });

            //save localstore
            localStore.sync();

        } else {
            //set count var
            var count = 0;

            //iterate each record in remotestore
            remoteStore.each(function (record) {
                //reset var
                var localRecord = null;
                //find matching record in localstore
                localRecord = localStore.findRecord('xid', record.data.xid, null, false, false, true);

                //if the record exists
                if (localRecord) {
                    //version check
                    if (record.data.version > localRecord.data.version) {
                        //remove record from localstore and add new one
                        localStore.remove(localRecord);
                        localStore.add(record.copy());
                        //increment counter
                        ++count;
                    }
                } else {
                    //add record to localstore
                    localStore.add(record);
                }
            });

            //save localstore
            if (localStore.sync()) {
                alert("store saved");
            }

            //if records were added we need to reload
            if (count > 0) {
                this.onUpdate();// or whatever your function is.
            }
        }
      }
    });  //ends

答案 1 :(得分:0)

在商店的加载方法中,只需传递addRecords:true,如下所示:

FMS.stores.onlineTodo.load({addRecords: true});