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

Posted

技术标签:

【中文标题】Sencha Touch 同步并从服务器获取新数据【英文标题】:Sencha Touch Sync and Get New Data from Server 【发布时间】:2012-03-07 09:30:54 【问题描述】:

我的应用是需要完成的待办事项列表。

    打开应用程序后,它会转到服务器并(从数据库)收集要完成的表单列表。 当您单击表单时,您可以填写数据(使用 LocalStorage 代理),然后保存/更新数据。数据本地存储在设备上。

截至目前:当我再次打开应用程序时,它会收集相同的待办事项列表并用新的空表单覆盖 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();
    


,

求助!!!!!!

【问题讨论】:

【参考方案1】:

如果我没记错的话,当你使用这个时,你正在清除所有的 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

【讨论】:

我该怎么做??我不确定如何查询相同的记录以查看它是否存在...您能给我一些示例代码或示例吗?? 给我一天的时间试试这个,然后回复你它是否有效 :) Grazie(提前) @SashaZd 请注意,此代码用于 ST2.0,可以简化和改进。例如,您可能希望使用模型实例而不是直接在商店中使用。还要考虑模型是否有任何关联,因为此代码没有。 :)【参考方案2】:

在你的 store 的 load 方法中,只传 addRecords:true,像这样:

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

【讨论】:

以上是关于Sencha Touch 同步并从服务器获取新数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sencha Touch 中的商店之间同步

Sencha Touch AJAX 请求问题:ReferenceError:找不到变量:请求

Sencha Touch : 更改存储中所有记录的值

从 Sencha Touch 2 跨域更新到外部服务器

Sencha Touch 商店同步回调

为啥 Sencha Touch 没有同步回调?