Sencha Touch Sync и получить новые данные с сервера - PullRequest
1 голос
/ 07 марта 2012

Мое приложение представляет собой список форм ToDo, которые необходимо заполнить.

  1. Когда приложение открыто, оно отправляется на сервер и собирает (из базы данных) список форм, которые необходимо заполнить.
  2. При нажатии на форму вы можете заполнить данные (используя прокси 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();
    }


},

HELP !!!!!

Ответы [ 2 ]

0 голосов
/ 08 июня 2013

в методе загрузки вашего магазина, просто передайте addRecords: true, вот так:

FMS.stores.onlineTodo.load({addRecords: true});
0 голосов
/ 08 марта 2012

Если я не ошибаюсь, вы очищаете все свои записи 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
...