SlideShare une entreprise Scribd logo
1  sur  16
Télécharger pour lire hors ligne
EEIncrementalStore
Enterprise Data Synchronization framework
Approccio classico
❖ Application centric: i servizi sono pensati per
una particolare applicazione e per il flusso di
navigazione su cui essa è costruita
❖ Service centric: al centro i servizi, l’
applicazione si adatta a ciò che viene messo
a disposizione
❖ Hybrid approach: la solita via di mezzo !
Approccio classico: lettura
❖ Dati richiesti al server
➢ le strutture ricevute sono memorizzate:
■ in memoria
■ su file-system
■ su un qualche DB locale
➢ dobbiamo pensare a come implementare il caching
■ politiche di caching
Approccio classico: scrittura
❖ Dati inviati al server
➢ uno o più servizi
➢ uno o più formati di trasferimento
Approccio classico: criticità
❖ Ogni volta si inizia da zero
Offline in un mondo connesso?
❖ Perché oggi che tutti parlano di banda larga
e connettività ovunque noi proponiamo un
framework che permette di lavorare offline ?
Cosa è disponibile ?
❖ Open source
➢ Helios.io
➢ OpenMobster

❖ Tra i più importanti a pagamento
➢ SAP Mobile 3.x
➢ Oracle Database Mobile Server 11g
➢ IBM WorkLight 5.x (*)

❖ As a service ???
NSIncrementalStore: poor’s iCloud
❖ Persistence store con i soli dati necessari
per l’app. Ideale per mobile app che usano
Web Services.
❖ Argomento complesso che Apple documenta
in modo piuttosto breve
❖ Dal progetto open source
AFIncrementalStore è stato possibile
comprenderne meglio il funzionamento.
EEIncrementalStore: architettura

@Entity

NSManagedObject

Cocoa Application

CoreData Model

JEE6 Application
EEIncrementalStore: oggetti
@Entity
@Remote
@NamedQueries({
@NamedQuery(name = "findAllArgomentoDTOs", query = "select distinct(e) from ArgomentoDTO e left join fetch e.
attivita"),
@NamedQuery(name = "findAllModifiedArgomentoDTOs", query = "select distinct(e) from ArgomentoDTO e left join
fetch e.attivita where e.modified > :modified"),
@NamedQuery(name = "deleteArgomentoDTOByPk", query = "delete from ArgomentoDTO e where e.argomentodto_id
= :key"),
@NamedQuery(name = "findAllArgomentoDTOsByKeys", query = "select e from ArgomentoDTO e where e.
argomentodto_id in :keys")
})
@JsonIgnoreProperties({
"_persistence_fetchGroup"
})
public class ArgomentoDTO
extends GenericMobileEntity
{
@Id
private String argomentodto_id;
private String descrizione;
@OneToMany
@JsonManagedReference
private List<AttivitaDTO> attivita = new ArrayList<AttivitaDTO>();
}

@class AttivitaDTO;
@interface ArgomentoDTO : NSManagedObject
@property (nonatomic, retain) NSString * argomentodto_id;
@property (nonatomic, retain) NSString * descrizione;
@property (nonatomic, retain) NSOrderedSet *attivita;
@end
@interface ArgomentoDTO (CoreDataGeneratedAccessors)
- (void)insertObject:(AttivitaDTO *)value inAttivitaAtIndex:(NSUInteger)idx;
- (void)removeObjectFromAttivitaAtIndex:(NSUInteger)idx;
- (void)insertAttivita:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
- (void)removeAttivitaAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInAttivitaAtIndex:(NSUInteger)idx withObject:(AttivitaDTO *)value;
- (void)replaceAttivitaAtIndexes:(NSIndexSet *)indexes withAttivita:(NSArray *)values;
- (void)addAttivitaObject:(AttivitaDTO *)value;
- (void)removeAttivitaObject:(AttivitaDTO *)value;
- (void)addAttivita:(NSOrderedSet *)values;
- (void)removeAttivita:(NSOrderedSet *)values;
@end
EEIncrementalStore: client side
Server
REST Web Services
Save

Client

GET, POST, PUT, DELETE

EEIncrementalStore
Fetch

In Memory
Persistence Store
(data model)

On Disk
Persistence Store
(data model)

DB
SQlite
EEIncrementalStore: server side
JEE6 Container

RESTful layer JAX-RS

JPA

Enterprise
Data
Mobile Objects
Cache

Online-Sync Plugin

Offline-Sync Flows
EEIncrementalStore: plugins
❖
❖

❖

Alcuni “Mobile Objects” hanno bisogno di logica applicativa
Per non doverla spostare sul client esiste la possibilità di usare gli “online
plugin” che permettono l’esecuzione di logica server-side e l’eventuale
modifica dei dati da mandare ai client
Sono solo CDI Observer, del tutto disaccoppiati dalla logica di
EEIncrementalStore:
@Override
public void myBusinessLogicMethod(@Observes @ReadSynch EntityInfo entityInfo) {
if(entityInfo.getEntityType().getJavaType().equals(ChecklistDTO.class)) {
Date modifiedSince = null;
…
…
}
EEIncrementalStore: caratteristiche
❖ L’applicazione può lavorare offline
❖ Lo sviluppatore del client lavora solo con
CoreData, API standard, e non si preoccupa
di dover implementare lo strato di servizi
❖ La vera logica applicativa rimane sul server
in forma di “plugin” di EEIncrementalStore
EEIncrementalStore: esempio
❖ Facciamo vedere un video per non
arrischiarci in demo live ?
❖ Mostriamo checklist o forse meglio l’esempio
classico con Employee, Departments, etc ??
EEIncrementalStore: sviluppi futuri
❖ Push con SSE
❖ Persistenza dei dati prima della sync
❖ Gestione automatica dei conflitti ??

Contenu connexe

Similaire à EE Incremental Store

MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009Massimiliano Dessì
 
MongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework MeetingMongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework Meetingguest67beeb9
 
May 2010 - Hibernate search
May 2010 - Hibernate searchMay 2010 - Hibernate search
May 2010 - Hibernate searchJBug Italy
 
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantSaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantTassi Francesco
 
Programmazione web libera dai framework
Programmazione web libera dai frameworkProgrammazione web libera dai framework
Programmazione web libera dai frameworkFrancesca1980
 
MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009Massimiliano Dessì
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
 
Abusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side StorageAbusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side Storageameft
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryAlberto Buschettu
 
Design Patterns - Enterprise Patterns (part 2)
Design Patterns - Enterprise Patterns (part 2)Design Patterns - Enterprise Patterns (part 2)
Design Patterns - Enterprise Patterns (part 2)Fabio Armani
 
How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignAndrea Saltarello
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBStefano Dindo
 
Elasticsearch a quick introduction
Elasticsearch a quick introductionElasticsearch a quick introduction
Elasticsearch a quick introductionFederico Panini
 
WEBdeBS NFC Presentation
WEBdeBS NFC PresentationWEBdeBS NFC Presentation
WEBdeBS NFC PresentationMyti S.r.l.
 
Whymca nfc presentation
Whymca nfc presentationWhymca nfc presentation
Whymca nfc presentationMyti S.r.l.
 
Android - ishan fernando - android nfc presentation
Android - ishan fernando - android nfc presentationAndroid - ishan fernando - android nfc presentation
Android - ishan fernando - android nfc presentationWhymca
 
Whymca nfc presentation
Whymca nfc presentationWhymca nfc presentation
Whymca nfc presentationMyti S.r.l.
 

Similaire à EE Incremental Store (20)

MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009
 
MongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework MeetingMongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework Meeting
 
May 2010 - Hibernate search
May 2010 - Hibernate searchMay 2010 - Hibernate search
May 2010 - Hibernate search
 
Hibernatesearch
HibernatesearchHibernatesearch
Hibernatesearch
 
SaaS con Symfony2
SaaS con Symfony2SaaS con Symfony2
SaaS con Symfony2
 
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantSaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
 
Programmazione web libera dai framework
Programmazione web libera dai frameworkProgrammazione web libera dai framework
Programmazione web libera dai framework
 
MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computing
 
Abusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side StorageAbusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side Storage
 
#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in Jquery
 
Design Patterns - Enterprise Patterns (part 2)
Design Patterns - Enterprise Patterns (part 2)Design Patterns - Enterprise Patterns (part 2)
Design Patterns - Enterprise Patterns (part 2)
 
How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven Design
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
 
Elasticsearch a quick introduction
Elasticsearch a quick introductionElasticsearch a quick introduction
Elasticsearch a quick introduction
 
WEBdeBS NFC Presentation
WEBdeBS NFC PresentationWEBdeBS NFC Presentation
WEBdeBS NFC Presentation
 
Whymca nfc presentation
Whymca nfc presentationWhymca nfc presentation
Whymca nfc presentation
 
Android - ishan fernando - android nfc presentation
Android - ishan fernando - android nfc presentationAndroid - ishan fernando - android nfc presentation
Android - ishan fernando - android nfc presentation
 
Whymca nfc presentation
Whymca nfc presentationWhymca nfc presentation
Whymca nfc presentation
 

Plus de firenze-gtug

Html5 apps - GWT oriented
Html5 apps - GWT orientedHtml5 apps - GWT oriented
Html5 apps - GWT orientedfirenze-gtug
 
Android ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi IntelAndroid ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi Intelfirenze-gtug
 
Gwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca TosiGwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca Tosifirenze-gtug
 
Youtube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'AmbrosioYoutube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'Ambrosiofirenze-gtug
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosiofirenze-gtug
 
Arduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'AmbrosioArduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'Ambrosiofirenze-gtug
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugianifirenze-gtug
 
RFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano ColucciniRFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano Coluccinifirenze-gtug
 
GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)firenze-gtug
 
Presentazione Google App Engine
Presentazione Google App EnginePresentazione Google App Engine
Presentazione Google App Enginefirenze-gtug
 
Maven from dummies
Maven from dummiesMaven from dummies
Maven from dummiesfirenze-gtug
 
Dev fest android application case study
Dev fest android application   case studyDev fest android application   case study
Dev fest android application case studyfirenze-gtug
 
google drive and the google drive sdk
google drive and the google drive sdkgoogle drive and the google drive sdk
google drive and the google drive sdkfirenze-gtug
 
You tube api overview
You tube api overviewYou tube api overview
You tube api overviewfirenze-gtug
 
Gwt development with errai and forge
Gwt development with errai and forgeGwt development with errai and forge
Gwt development with errai and forgefirenze-gtug
 
Google tv gdg_devfest_firenze2012
Google tv gdg_devfest_firenze2012Google tv gdg_devfest_firenze2012
Google tv gdg_devfest_firenze2012firenze-gtug
 
Dev fest2012 opening
Dev fest2012   openingDev fest2012   opening
Dev fest2012 openingfirenze-gtug
 
Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5firenze-gtug
 

Plus de firenze-gtug (20)

Html5 apps - GWT oriented
Html5 apps - GWT orientedHtml5 apps - GWT oriented
Html5 apps - GWT oriented
 
Android ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi IntelAndroid ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi Intel
 
Gwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca TosiGwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca Tosi
 
Youtube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'AmbrosioYoutube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'Ambrosio
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosio
 
Arduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'AmbrosioArduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'Ambrosio
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
 
RFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano ColucciniRFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano Coluccini
 
GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)
 
Presentazione Google App Engine
Presentazione Google App EnginePresentazione Google App Engine
Presentazione Google App Engine
 
Maven from dummies
Maven from dummiesMaven from dummies
Maven from dummies
 
Apps fuel oct2012
Apps fuel oct2012Apps fuel oct2012
Apps fuel oct2012
 
Dev fest android application case study
Dev fest android application   case studyDev fest android application   case study
Dev fest android application case study
 
google drive and the google drive sdk
google drive and the google drive sdkgoogle drive and the google drive sdk
google drive and the google drive sdk
 
You tube api overview
You tube api overviewYou tube api overview
You tube api overview
 
AdWordsScripts v1
AdWordsScripts v1AdWordsScripts v1
AdWordsScripts v1
 
Gwt development with errai and forge
Gwt development with errai and forgeGwt development with errai and forge
Gwt development with errai and forge
 
Google tv gdg_devfest_firenze2012
Google tv gdg_devfest_firenze2012Google tv gdg_devfest_firenze2012
Google tv gdg_devfest_firenze2012
 
Dev fest2012 opening
Dev fest2012   openingDev fest2012   opening
Dev fest2012 opening
 
Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5
 

EE Incremental Store

  • 2. Approccio classico ❖ Application centric: i servizi sono pensati per una particolare applicazione e per il flusso di navigazione su cui essa è costruita ❖ Service centric: al centro i servizi, l’ applicazione si adatta a ciò che viene messo a disposizione ❖ Hybrid approach: la solita via di mezzo !
  • 3. Approccio classico: lettura ❖ Dati richiesti al server ➢ le strutture ricevute sono memorizzate: ■ in memoria ■ su file-system ■ su un qualche DB locale ➢ dobbiamo pensare a come implementare il caching ■ politiche di caching
  • 4. Approccio classico: scrittura ❖ Dati inviati al server ➢ uno o più servizi ➢ uno o più formati di trasferimento
  • 5. Approccio classico: criticità ❖ Ogni volta si inizia da zero
  • 6. Offline in un mondo connesso? ❖ Perché oggi che tutti parlano di banda larga e connettività ovunque noi proponiamo un framework che permette di lavorare offline ?
  • 7. Cosa è disponibile ? ❖ Open source ➢ Helios.io ➢ OpenMobster ❖ Tra i più importanti a pagamento ➢ SAP Mobile 3.x ➢ Oracle Database Mobile Server 11g ➢ IBM WorkLight 5.x (*) ❖ As a service ???
  • 8. NSIncrementalStore: poor’s iCloud ❖ Persistence store con i soli dati necessari per l’app. Ideale per mobile app che usano Web Services. ❖ Argomento complesso che Apple documenta in modo piuttosto breve ❖ Dal progetto open source AFIncrementalStore è stato possibile comprenderne meglio il funzionamento.
  • 10. EEIncrementalStore: oggetti @Entity @Remote @NamedQueries({ @NamedQuery(name = "findAllArgomentoDTOs", query = "select distinct(e) from ArgomentoDTO e left join fetch e. attivita"), @NamedQuery(name = "findAllModifiedArgomentoDTOs", query = "select distinct(e) from ArgomentoDTO e left join fetch e.attivita where e.modified > :modified"), @NamedQuery(name = "deleteArgomentoDTOByPk", query = "delete from ArgomentoDTO e where e.argomentodto_id = :key"), @NamedQuery(name = "findAllArgomentoDTOsByKeys", query = "select e from ArgomentoDTO e where e. argomentodto_id in :keys") }) @JsonIgnoreProperties({ "_persistence_fetchGroup" }) public class ArgomentoDTO extends GenericMobileEntity { @Id private String argomentodto_id; private String descrizione; @OneToMany @JsonManagedReference private List<AttivitaDTO> attivita = new ArrayList<AttivitaDTO>(); } @class AttivitaDTO; @interface ArgomentoDTO : NSManagedObject @property (nonatomic, retain) NSString * argomentodto_id; @property (nonatomic, retain) NSString * descrizione; @property (nonatomic, retain) NSOrderedSet *attivita; @end @interface ArgomentoDTO (CoreDataGeneratedAccessors) - (void)insertObject:(AttivitaDTO *)value inAttivitaAtIndex:(NSUInteger)idx; - (void)removeObjectFromAttivitaAtIndex:(NSUInteger)idx; - (void)insertAttivita:(NSArray *)value atIndexes:(NSIndexSet *)indexes; - (void)removeAttivitaAtIndexes:(NSIndexSet *)indexes; - (void)replaceObjectInAttivitaAtIndex:(NSUInteger)idx withObject:(AttivitaDTO *)value; - (void)replaceAttivitaAtIndexes:(NSIndexSet *)indexes withAttivita:(NSArray *)values; - (void)addAttivitaObject:(AttivitaDTO *)value; - (void)removeAttivitaObject:(AttivitaDTO *)value; - (void)addAttivita:(NSOrderedSet *)values; - (void)removeAttivita:(NSOrderedSet *)values; @end
  • 11. EEIncrementalStore: client side Server REST Web Services Save Client GET, POST, PUT, DELETE EEIncrementalStore Fetch In Memory Persistence Store (data model) On Disk Persistence Store (data model) DB SQlite
  • 12. EEIncrementalStore: server side JEE6 Container RESTful layer JAX-RS JPA Enterprise Data Mobile Objects Cache Online-Sync Plugin Offline-Sync Flows
  • 13. EEIncrementalStore: plugins ❖ ❖ ❖ Alcuni “Mobile Objects” hanno bisogno di logica applicativa Per non doverla spostare sul client esiste la possibilità di usare gli “online plugin” che permettono l’esecuzione di logica server-side e l’eventuale modifica dei dati da mandare ai client Sono solo CDI Observer, del tutto disaccoppiati dalla logica di EEIncrementalStore: @Override public void myBusinessLogicMethod(@Observes @ReadSynch EntityInfo entityInfo) { if(entityInfo.getEntityType().getJavaType().equals(ChecklistDTO.class)) { Date modifiedSince = null; … … }
  • 14. EEIncrementalStore: caratteristiche ❖ L’applicazione può lavorare offline ❖ Lo sviluppatore del client lavora solo con CoreData, API standard, e non si preoccupa di dover implementare lo strato di servizi ❖ La vera logica applicativa rimane sul server in forma di “plugin” di EEIncrementalStore
  • 15. EEIncrementalStore: esempio ❖ Facciamo vedere un video per non arrischiarci in demo live ? ❖ Mostriamo checklist o forse meglio l’esempio classico con Employee, Departments, etc ??
  • 16. EEIncrementalStore: sviluppi futuri ❖ Push con SSE ❖ Persistenza dei dati prima della sync ❖ Gestione automatica dei conflitti ??