Mobile Sync ã䜿çšãããªãã©ã€ã³ã§ã®å€æŽã®åæ
åŠç¿ã®ç®ç
ãã®åå ãå®äºãããšã次ã®ããšãã§ããããã«ãªããŸãã
- Mobile Sync ã®åºæ¬çãªæŠå¿µãçè§£ããã
- Mobile Sync ã©ã€ãã©ãªã䜿çšããŠããŠãŒã¶ãŒã®ããŒã«ã«ããã€ã¹ãš Salesforce ãµãŒããŒéã§ããŒã¿ãåæããã
Mobile Sync ã䜿çšãããªãã©ã€ã³ã§ã®å€æŽã®åæ
Mobile Sync ã¯ãSmartStore ãšé£æºããŠãSalesforce ã¬ã³ãŒãã®æŽåæ§ãšäžè²«æ§ãä¿èšŒãã Mobile SDK ã©ã€ãã©ãªã§ããMobile Sync ã«ãããMobile SDK ã¢ããªã±ãŒã·ã§ã³ã䜿çšããã客æ§ã®ã¢ãã€ã«ããã€ã¹ã®æ¥ç¶ã倱ããããšãã«ãSalesforce ã¬ã³ãŒããåŒãç¶ãããŒã«ã«ã§ç·šéããããšãå¯èœã«ãªããŸããæ¥ç¶ãå埩ãããšãMobile SDK ã¢ããªã±ãŒã·ã§ã³ã¯ãã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãSmartStore å ã®ããŒã«ã«å€æŽã Salesforce ãµãŒããŒäžã®å¯Ÿå¿ããã¬ã³ãŒãã«åæããŸãã
ãããã¯ãŒã¯èŠæ±ã«ã€ããŠ
Mobile Sync ã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿èŠæ±ã¯ãã¹ãŠéåæã§ããåæã¡ãœããã¯èŠæ±ããã©ãŒãããããSalesforce Cloud ã«éä¿¡ããŸããã¢ããªã±ãŒã·ã§ã³ã¯ããã©ãããã©ãŒã ã«å¿ããŠããµãŒããŒã®å¿çãã³ãŒã«ããã¯ã¡ãœãããæŽæ°ãããã¯ãpromise ã§åä¿¡ããŸããå¿çã«ã¯ãåææäœã®èšå®ãšç¶æ³ã説æããåæç¶æ ãªããžã§ã¯ããå«ãŸããŸãã
Mobile Sync ã®ã¡ãœããã«ãããsObject ã¡ã¿ããŒã¿ã®ååŸãæè¿äœ¿çšããããªããžã§ã¯ãã®ãªã¹ãã®ååŸãSOQL ããã³ SOSL ã¯ãšãªã®çºè¡ãªã©ãããè¡ããããã¯ãŒã¯äœæ¥ãèªååã§ããŸããã¢ããªã±ãŒã·ã§ã³ã¯åæãããŒãžã£ãŒã¡ãœããããã€ã§ãã³ãŒã«ã§ããŸãããæåããã®ã¯ãã¹ãããã€ã¹ãã€ã³ã¿ãŒãããã«æ¥ç¶ãããŠããå Žåã®ã¿ã§ããããã€ã¹ã®æ¥ç¶ç¶æ³ã¯ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠå€æãããŸãã
Mobile Sync ã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®èšå®
Mobile SDK ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãäžå€® SDK ãããŒãžã£ãŒãªããžã§ã¯ãã䜿çšããŠãé©åãªã¢ããªã±ãŒã·ã§ã³ã®èµ·åãšèªèšŒã®ãããã³ã«ãé©çšããŸããã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããããããŒãžã£ãŒã«ãã£ãŠããã®ã¢ããªã±ãŒã·ã§ã³ã«å«ãŸãã SDK æ©èœã®ç¯å²ã決ãŸããŸããã¢ããªã±ãŒã·ã§ã³ã¯ããŒãã¹ãã©ããã®åæåæã« MobileSyncSDKManager ãªããžã§ã¯ããåæåããŸãã
ãã€ãã£ã Android ããã³ iOS ã® SDK ã¯ã3 ã€ã®ãããŒãžã£ãŒãªããžã§ã¯ããå®è£ ããŸãã
SalesforceSDKManager
ã»ãšãã©ã®åºæ¬çãªã¢ããªã±ãŒã·ã§ã³çšããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãMobile SDK ã®ãªãã©ã€ã³æ©èœã䜿çšããŸããã
SmartStoreSDKManager
SmartStore ã¯äœ¿çšããã Mobile Sync ã䜿çšããªãã¢ããªã±ãŒã·ã§ã³çšã
MobileSyncSDKManager
SmartStore ãš Mobile Sync ã®äž¡æ¹ã䜿çšããã¢ããªã±ãŒã·ã§ã³çšã
forcedroid ãŸã㯠forceios ã䜿çšããŠãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãäœæãããšãæ°ããã¢ããªã±ãŒã·ã§ã³ã¯ MobileSyncSDKManager ã䜿çšããããã«èªåçã«èšå®ãããŸãããã®ãããŒãžã£ãŒã¯ãSmartStoreãMobile Syncããã®ä»ã®ãã¹ãŠã® Mobile SDK ã©ã€ãã©ãªãã€ã³ããŒãããŸãã
åæèšå®
SmartStore ãã Salesforce ãžã®äžäœåæãè¡ã£ãŠããå Žåã§ããSalesforce ãã SmartStore ãžã®äžäœåæãè¡ã£ãŠããå Žåã§ããåæèšå®ã®è©³çްãæå®ããŸããåææäœã¯ã³ãŒããŸã㯠JSON èšå®ãã¡ã€ã«ã§èšå®ã§ããŸãããããã®å ŽåããMobile SDK ã¯ãå®è¡æã«ãã®èšå®ãåæç¶æ ãªããžã§ã¯ãã§è¿ããŸãã
æãåºæ¬çãªã¬ãã«ã§ã¯ã次ã®ãã®ãæå®ããŸãã
- store â ã¹ãã¢ã«ã¿ãã°ã°ããŒãã«ã¹ãã¢ãšãŠãŒã¶ãŒã¹ãã¢ã®ã©ã¡ãã®ã¹ãã¢äœ¿çšããŠãããã瀺ããŸããæå®ã¹ãã¢ã䜿çšããŠããå Žåã¯ããã®ååãæå®ããŸãã
- soup name â ã¹ãŒãåãäžäœåææäœã®ãœãŒã¹ãŸãã¯äžäœåææäœã®åä¿¡åŽãšãªãã¹ãŒãã®ååããã®ã¹ãŒãã§ã¯ã
__local__ãšããååã®ã€ã³ããã¯ã¹ä»ããããæååé ç®ããµããŒããããŠããå¿ èŠããããŸãã
ãã®ä»ã® 2 ã€ã®ãã©ã¡ãŒã¿ãŒã¯ãåææäœã®åäœãå®çŸ©ããŸãã
- target â ã©ã®ã¬ã³ãŒããåæãããã瀺ããŸããã¿ãŒã²ããã¯ãããããåæåäœã®äžå¿çãªèšå®å€ã§ããã¿ãŒã²ããã¯ãæäœã«å¿
èŠãªããŒã¿ã®ç¯å²ã衚ããã®ã§ãããšèããŠãã ããã
- options â æäœã«ãã£ãŠã©ã®ããã«ããŒã¿ãããŒãžãããããå¶åŸ¡ããŸããå Žåã«ãã£ãŠã¯ãã¿ãŒã²ããã®ä»£ããã«ãªãã·ã§ã³ã䜿çšããŠãåæããé
ç®åã®ãªã¹ããæå®ã§ããŸãã
target ãã©ã¡ãŒã¿ãŒãš options ãã©ã¡ãŒã¿ãŒã®äœ¿ç𿹿³ã¯ãäžäœåæãšäžäœåæã§ç°ãªããŸããããã«ã€ããŠã¯ã以éã®ã»ã¯ã·ã§ã³ã§èª¬æããŸããå Žåã«ãã£ãŠã¯ãã©ã¡ããäžæ¹ã®ãã©ã¡ãŒã¿ãŒãçç¥ã§ããŸããtarget ãŸã㯠options ãçç¥ãããšãMobile Sync ã¯ããã©ã«ãå€ã䜿çšããŸãã
åææäœã®å®äºåŸãã¢ããªã±ãŒã·ã§ã³ã¯ãã©ããŒã¢ããã¿ã¹ã¯ã®å®è¡ãèš±å¯ããéåæã®éç¥ãåä¿¡ããŸãããã®ã¿ã¹ã¯ã«ã¯ãã€ãã³ãéç¥ãéä¿¡ããããæåãèšé²ããããã¢ããªã±ãŒã·ã§ã³ã匷åãããã®ä»ã®æ¹æ³ã§ããŒã¿ã䜿çšããããšãå«ãŸããŸãã
äžäœåæã®ã¿ãŒã²ãããšãªãã·ã§ã³
- target â ãœãŒã¹ sObject åãšã¹ãŒãã«ããŠã³ããŒãããé
ç®ãæå®ããŸããæ¬¡ã®ããããã®æååã䜿çšã§ããŸãã
- SOQL ã¯ãšãªã®å Žå:
{type:"soql", query:"<soql_query>"}æå®ãã SOQL ã¯ãšãªã§è¿ããã sObject ãããŠã³ããŒãããŸãã - SOSL ã¯ãšãªã®å Žå:
{type:"sosl", query:"<sosl_query>"}æå®ãã SOSL ã¯ãšãªã§è¿ããã sObject ãããŠã³ããŒãããŸãã - MRU ã¯ãšãªã®å Žå:
{type:"mru", sobjectType:"<sobject_type>", fieldlist:"<fields_to_fetch>"}æå®ãã sObject åã«è©²åœãããæè¿äœ¿çšãã sObject ã®ãæå®ããé ç®ãããŠã³ããŒãããŸããMobile SDK ã¯èŠæ±ã Salesforce ã«éä¿¡ããå¿çãåä¿¡ããèšå®ã䜿çšããŠã¹ãŒãã«å ¥åããŸãã
- options â (çç¥å¯èœ) 次ã®ããŒãšå¯Ÿå¿ä»ããŸãã
mergeModeâ Mobile Sync ãããŒã«ã«ã®ã¹ãŒãã«ããŒã¿ãããŒãžããæ¹æ³ãå¶åŸ¡ããã«ã¯ããã®ããŒã次ã®ããããã®ã¢ãŒãã«èšå®ããŸãã
Overwrite
(ããã©ã«ã) 倿Žãããã¬ã³ãŒããäžæžãããŸããããŒãžã¢ãŒããæå®ããªãå ŽåãMobile Sync ã¯ããŒã«ã«ããŒã¿ãäžæžãããŸãã
[Leave if changed (倿޿ã¯ä¿æ)]
倿Žãããã¬ã³ãŒããä¿æããŸãããã®ã¢ãŒãã§ã¯ããµãŒããŒãžã®è¿œå ã®åŸåŸ©åŠçãå¿ èŠã«ãªããããæ éã«äœ¿çšããŠãã ããã
äžäœåæã®ã¿ãŒã²ãããšãªãã·ã§ã³
- target â æ¬¡ã®ãããããŸãã¯äž¡æ¹ã®ããŒãšå¯Ÿå¿ä»ããŸãã
createFieldlistâ æ°ããäœæããã Salesforce ã¬ã³ãŒãã«å€ãæ¿å ¥ãããã¹ãŒãé ç®åã®ã«ã³ãåºåããªã¹ããããã¯ããã (åç §ã®ã¿ã®) é ç®ãå«ããããšãã§ããŸããupdateFieldlistâ æ¢åã® Salesforce ã¬ã³ãŒãã®æžã蟌ã¿å¯èœãªé ç®ãæŽæ°ããããã«äœ¿çšãããã¹ãŒãé ç®åã®ã«ã³ãåºåããªã¹ããããã¯ããã (åç §ã®ã¿ã®) é ç®ãå«ããããšã¯ã§ããŸããã
- target ã¯ãäžéšã®äžäœåæã¡ãœããã§ã¯å¿
é ã§ã¯ãããŸããããã®ãããªå Žåã
optionsã®fieldlistããŒã䜿çšããŠãåæããé ç®ãæå®ããŸãã - options â (çç¥å¯èœ) 次㮠1 ã€ä»¥äžã®ããŒãšå¯Ÿå¿ä»ããŸãã
fieldlistâ ãµãŒããŒã«éä¿¡ããã¹ãŒãé ç®åã®ã«ã³ãåºåããªã¹ãããã®ããŒãtargeté ç®ãªã¹ãã®ä»£ããã«äœ¿çšããããtarget ã®createFieldListãšäœ¿çšã§ããŸããäžäœåææäœã«ãã£ãŠããµãŒããŒã®åç §ã®ã¿ã®é ç®ãæŽæ°ããããšããŠããªãããšã確èªããŠãã ãããmergeModeâ Mobile Sync ãããŒã«ã«ããŒã¿ã Salesforce çµç¹ã«ããŒãžããæ¹æ³ãå¶åŸ¡ããã«ã¯ããã®ããŒã次ã®ããããã®ã¢ãŒãã«èšå®ããŸãã
Overwrite
(ããã©ã«ãèšå®) 倿ŽããããµãŒããŒã¬ã³ãŒããäžæžãããŸãã
[Leave if changed (倿޿ã¯ä¿æ)]
倿ŽããããµãŒããŒã¬ã³ãŒããä¿æããŸãããã®ã¢ãŒãã§ã¯ããµãŒããŒãžã®è¿œå ã®åŸåŸ©åŠçãå¿ èŠã«ãªããããæ éã«äœ¿çšããŠãã ããã
ã¹ãã¢ãã©ã¡ãŒã¿ãŒ
ãã€ããªããã¢ããªã±ãŒã·ã§ã³ãš React Native ã¢ããªã±ãŒã·ã§ã³ã¯ãçç¥å¯èœãª storeConfig ãã©ã¡ãŒã¿ãŒã§äœ¿çšããŠããã¹ãã¢ã瀺ããŸãããã®ãã©ã¡ãŒã¿ãŒã¯ãäžäœåææäœãšäžäœåææäœã«é©çšãããŸããæ¬¡ã® 2 ã€ã®ããããã®æ¹æ³ã§æå®ã§ããŸãã
次ã®ã㌠- å€ãã¢ã®å¯Ÿå¿ä»ã
- isGlobalStore â (çç¥å¯èœ) ã°ããŒãã«ã¹ã㢠(
true) ãšãŠãŒã¶ãŒã¹ã㢠(false) ã®ã©ã¡ãã䜿çšããŠãããã瀺ã Boolean å€ãããã©ã«ãã¯falseã§ãã - storeName â (çç¥å¯èœ) ã¹ãã¢ã®ååãããã©ã«ãå€ã¯ããã©ã«ãã¹ãã¢ã®ååã§ãã
次ã«äŸã瀺ããŸãã
{"isGlobalStore" : false, "storeName" : "MyStore"}Boolean å€
代ããã«åçŽãª Boolean å€ãæž¡ãããšãã§ããŸãããã®å ŽåãMobile SDK ã¯å€ã isGlobalStore ããŒã«å²ãåœãŠãŸãã
store ãã©ã¡ãŒã¿ãŒãçç¥ãããšãMobile Sync ãçŸåšã®ãŠãŒã¶ãŒã¹ãã¢ã§æäœãå®è¡ããŸãã
ååä»ãåæãšåæèšå®ãã¡ã€ã«ã®äœ¿çš
æšæºã®äžäœåæã¡ãœãããšäžäœåæã¡ãœããã§ã¯ãååæãã©ã¡ãŒã¿ãŒãå¥åã®åŒæ°ãšããŠæž¡ãå¿ èŠããããŸããMobile SDK ã«ã¯ãåæãæŽçããŠåçåãã 2 ã€ã®æ©èœããããŸããå°å ¥ãããæ©èœã¯ãåæåãšåæèšå®ãã¡ã€ã«ã§ãæå°éã®åŽåã§å¹æãåŸãããŸããèšå®ãã¡ã€ã«ã䜿çšããããšã¯å¿ é ã§ã¯ãããŸãããããã®ãã¬ã€ã«ã§ã¯å¹ åºã䜿çšããŸãã
åæãåå®è¡ããã«ã¯ããã©ãããã©ãŒã ã® reSync ã¡ãœããã䜿çšããŸããååæã¡ãœããã¯ã次ã®ããããã®èå¥åã䜿çšããŠèšå®ãèŠã€ããŸãã
- åæ ID â ãã¹ãŠã®åæã¡ãœããã¯ç¶æ
ãªããžã§ã¯ãã®äžéšãšããŠãã® ID ãè¿ããŸãããã® ID ã
reSyncã«æž¡ããŠãçŸåšã®ã»ãã·ã§ã³ã§ãã§ã«äœ¿çšããåæãåå®è¡ã§ããŸãã - åæå (çç¥å¯èœ) â æåã®å®è¡æã«ã¡ã¢ãªå
ã®åæèšå®ã«ååãä»ããããå€éš JSON ãã¡ã€ã«ããååãšåæèšå®ãã€ã³ããŒãããããšãã§ããŸãã
åæå
åææäœã®èšå®ã¯è€éã«ãªãããšããããããåå©çšãããŸããåæåã¯åæãèšé²ããã«åå®è¡ããã®ã«äŸ¿å©ã§ããããšãã°ãåæåã䜿çšããŠæ¬¡ã®ããšãå®è¡ã§ããŸãã
- ã³ãŒãã§ã¯ãªãå€éš JSON ãã¡ã€ã«ã§åææäœãèšå®ãã
- 以å䜿çšããæäœãåèšå®ããã«åå®è¡ãã
- é²è¡äžã®åææäœã®ç¶æ³ãååŸãã
- åæèšå®ã®ååšã確èªãã
- åæèšå®ãåé€ãã
ååä»ãåæã¯ãAPI ãŸãã¯åæèšå®ãã¡ã€ã«ã§äœæã§ããŸããMobile SDK ã§ã¯ããã¹ãŠã®ãã©ãããã©ãŒã ããã³ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³çš®å¥ã§ååä»ãåæããµããŒããããŠããŸãã
åæèšå®ãã¡ã€ã«
åæèšå®ãã¡ã€ã«ã䜿çšããå Žåãéçãªäžäœåæãšäžäœåæå®çŸ©ã JSON ãã¡ã€ã«ã§ 1 åèšè¿°ããã°ãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ããŒãžã§ã³ã§ã€ã³ããŒãã§ããŸããMobile SDK ã§ã¯ããã€ãã£ãããã³ãã€ããªããã®ã¢ããªã±ãŒã·ã§ã³ã§åæèšå®ãã¡ã€ã«ããµããŒããããŠããŸãããããã®ãã¡ã€ã«ã®æ§é ãšã«ãŒã«ãèŠãŠã¿ãŸãããã
ãã¡ã€ã«å
Mobile SDK ã§ã¯ãããã©ã«ãã°ããŒãã«ã¹ãã¢ãšããã©ã«ããŠãŒã¶ãŒã¹ãã¢ã§ã®ã¿èšå®ãã¡ã€ã«ããµããŒããããŠããŸãã
- ããã©ã«ãã°ããŒãã«ã¹ãã¢ã®å Žåãglobalsyncs.json ãšããååã®ãã¡ã€ã«ãæå®ããŸãã
- ããã©ã«ããŠãŒã¶ãŒã¹ãã¢ã®å Žåãusersyncs.json ãšããååã®ãã¡ã€ã«ãæå®ããŸãã
ãã¡ã€ã«ã®å Žæ
èšå®ãã¡ã€ã«ã¯æ¬¡ã®å Žæã«çœ®ããŸãã
iOS:
- ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãš React Native ã¢ããªã±ãŒã·ã§ã³: Resources ãã³ãã«ã® /
- ãã€ããªããã¢ããªã±ãŒã·ã§ã³: Resources ãã³ãã«ã® /www
Android:
- ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãš React Native ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³: /res/raw
- ãã€ããªããã¢ããªã±ãŒã·ã§ã³: /assets/www
ãã¡ã€ã«åœ¢åŒ
ãã¡ã€ã«åœ¢åŒã¯ãã¢ããªã±ãŒã·ã§ã³çš®å¥ãã¿ãŒã²ãããã©ãããã©ãŒã ã«é¢ä¿ãªãåãã§ããåæå®çŸ©ã«ã¯æ¬¡ã® 5 ã€ã®é ç®ãå¿ èŠã§ãã
- åæå
- åæçš®å¥
- ã¹ãŒãå
- 察象
- ãªãã·ã§ã³
以äžã®èšå®ãã¡ã€ã«ã¯ãäžäœåææäœãšäžäœåææäœãå®çŸ©ããŸããäž¡æ¹ã®èšå®ã§åãé ç® (IdãNameãLastModifiedDate) ã䜿çšããŸãããã ããå€ã®é 眮ã«ã€ããŠæ¬¡ã® 2 ã€ã®éèŠãªã«ãŒã«ããããŸãã
- äžäœåæèšå®ã§ã¯ãtargetãã¡ã³ããŒã§ SOQL ã¯ãšãªã䜿çšããŠé
ç®ãæå®ããã®ã«å¯ŸããŠãäžäœåæã§ã¯ãoptionsãã§ãªã¹ããšããŠæå®ããŸãã
- äžäœåææäœã§ã¯ãããŒãžã¢ãŒãããoptionsãã§æå®ããã®ã«å¯ŸããŠãäžäœåæã§ã¯ãmerge_modeãã§æå®ããŸãã
å察ã®ããŒãžã¢ãŒã (äžäœåæã®ãOVERWRITEãã«å¯ŸããŠäžäœåæã®ãLEAVE_IF_CHANGEDã) ã«èšå®ããããšã§ãäžå çã§æ£ç¢ºãªæ å ±ãç¶æã§ããŸãããã®å ŽåããµãŒããŒããŒã¿ã¯ã¹ãŒãããŒã¿ãäžæžãã§ããŸãããéã¯ã§ããŸããã
{
"syncs": [
{
"syncName": "sync1",
"syncType": "syncDown",
"soupName": "accounts",
"target": {"type":"soql", "query":"SELECT Id, Name, LastModifiedDate
FROM Account"},
"options": {"mergeMode":"OVERWRITE"}
},
{
"syncName": "sync2",
"syncType": "syncUp",
"soupName": "accounts",
"target": {"createFieldlist":["Name"]},
"options": {"fieldlist":["Id", "Name", "LastModifiedDate"],
"mergeMode":"LEAVE_IF_CHANGED"}
}
]
}Mobile Sync ãšããªãŒãã±ãŒã¹ã®äœ¿çš
ããªãŒãã±ãŒã¹ã¯ãé¢é£ã¬ã³ãŒãã®ãŸãšãŸãã®ããã³ã¬ã¯ã·ã§ã³ãåæã«éžæããäžé£ã®ã¯ãšãªã§ãããç®çã«åãããŠæé©åãããŸããããªãŒãã±ãŒã¹ã¯ããªãã©ã€ã³ã«ãªãåã®ããŒã¿ãã©ã€ãã³ã°ãä»ã®äžè¬çãªããŒã¿èªã¿èŸŒã¿ã®ç®çã§ã¬ã³ãŒããéžæããããã«äœ¿çšã§ããŸãã
åæèšå®
Mobile Sync Explorer ãã³ãã¬ãŒãã¢ããªã±ãŒã·ã§ã³ã§ããŠãŒã¶ãŒåæã® JSON ãã¡ã€ã«ãæŽæ°ããŠäžäœåææäœãšäžäœåææäœãèšå®ã§ããŸãã
"target" ããããã£ã«ã¯ã次ã®å€ãæå®ããŸãã
target ããããã£
"type":"briefcase"
"infos": <BriefcaseObjectInfo> é ç®ã®é å
ååŸããç¹å®ã® sObject ãšé ç®ããã³ããããé 眮ããã¹ãŒããèšè¿°ãããªããžã§ã¯ãã®é åã
BriefcaseObjectInfo ããããã£
"soupName": <string>
åæäžã«ãã®ãªããžã§ã¯ãçš®å¥ã®ã¬ã³ãŒããä¿åããã¹ãŒããŸãã¯ããŒãã«ã®ååã
"sobjectType": <string>
åæãã Salesforce ãªããžã§ã¯ãã®ååã
"fieldlist": <string> ã®é å
ãã®ãªããžã§ã¯ãã®åæããé ç®ã®ãªã¹ãã
"idFieldName": <string>
(çç¥å¯èœ) ã«ã¹ã¿ã ID é ç®ã®ååã"idFieldName" ãæå®ããå ŽåãMobile Sync ã¯ãæå®ãããååã®é ç®ã䜿çšããŠãã¬ã³ãŒãã® ID ãååŸããŸããããšãã°ã"idFieldName":"AcmeId" ãæå®ããå ŽåãMobile Sync ã¯ãããã©ã«ãã® Id é ç®ã§ã¯ãªããAcmeId é ç®ããã¬ã³ãŒãã® ID ãååŸããŸãã
"modificationDateFieldName": <string>
(çç¥å¯èœ) ã¬ã³ãŒãã®æçµå€æŽæ¥ä»ãå«ãé ç®ã®ååãmodificationDateFieldName ãæå®ããå ŽåãMobile Sync ã¯ããã®ååã®é ç®ã䜿çšããŠãstartFetch ãã¬ã³ãŒãã®ååæã®ããã«äœ¿çšãã maxTimestamp å€ãèšç®ããŸããããã©ã«ãã®é ç®å㯠lastModifiedDate ã§ãã
å¿ é é ç®: "soupName"ã"sobjectType"ã"fieldlist"
äžäœåæ
äžäœåæçšã«èšå®ãããããªãŒãã±ãŒã¹ãã¡ã€ã«ã®äŸãèŠãŠã¿ãŸãããã
{
  "syncs": [
    {
      "syncName": "syncDownContacts",Â
      "syncType": "syncDown",
      "soupName": "contacts",
      "target": {
        "type": "briefcase",     Â
        "infos": [
          {
            "sobjectType": "Account",
            "fieldlist": [
              "Name",
              "Description"
            ],
            "soupName": "accounts"
          },
          {
            "sobjectType": "Contact",
            "fieldlist": [
              âFistNameâ, "LastName", âTitleâ, âEmailâ
            ],
            "soupName": "contacts"
          }
        ]
      },
      "options": {
        "mergeMode": "OVERWRITE"
      }
    }
  ]
}äžäœåæããã«ã¯ãâsyncTypeâ ã âsyncDownâ ãšããŠå®çŸ©ããŸããããã«ãããäžäœåææäœãæå¹ã«ãªããããŒã¿ããµãŒããŒããã¯ã©ã€ã¢ã³ãã«åæãããŸããâsyncNameâ ã®æšªã«äžäœåææäœã®ååãæå®ã§ããŸãããã®å Žåãåå㯠âsyncDownContactsâ ã§ãã
âsoupNameâ ã®æšªã«ãäžäœåææäœãå®è¡ããããæŽæ°ããããŒãã«ãŸãã¯ã¹ãŒããå®çŸ©ããŸãããã®å ŽåãæŽæ°ããã¹ãŒãã®åå㯠âcontactsâ ã§ãã
âtargetâ ã®äžã«ãã¿ãŒã²ããçš®å¥ã âbriefcaseâ ãšå®çŸ©ããŸããâinfosâ JSON ãªããžã§ã¯ãã®äžã«ãåæãããšã³ãã£ãã£ãå®çŸ©ã§ããŸãããã®å ŽåãâAccountâ ãš âContactâ ã§ãããšã³ãã£ãã£ããšã«ãåæããé
ç®ã âfieldlistâ ã«æå®ããŸãã
ãšã³ãã£ãã£ããšã«ãâsoupNameâ ã®æšªã«ã¯ã©ã€ã¢ã³ãäžã§æŽæ°ããã察å¿ããããŒãã«ãæå®ããŸããÂ
âoptionsâ ã®äžã« âmergeModeâ ãªãã·ã§ã³ãå®çŸ©ã§ããŸãããã®å ŽåãâOVERWRITEâ ã«èšå®ãããŠããŸãã2 人ã®ãŠãŒã¶ãŒãåãã¬ã³ãŒããæŽæ°ããããšãããšããã®ãªãã·ã§ã³ã«ãã£ãŠãæåŸã«æŽæ°ãããŠãŒã¶ãŒã«äžæžãåªå
æš©ãäžããããŸãã
äžäœåæ
次ã¯ãäžäœåæã®èšå®ãèŠãŠãããŸãããã
{
âsyncName: âsyncUpContactsâ,
âsyncTypeâ: âsyncUpâ,
âsoupÃameâ: âcontactsâ,
âtargetâ: {
âcreateFieldlistâ: [
âFirstNameâ, âLastNameâ, âTitleâ, âEmailâ
]
},
âoptionsâ: {
âfieldlistâ: [
âFirstNameâ, âLastNameâ, âTitleâ, âEmailâ
],
âmergeModeâ: âLEAVE_IF_CHANGEDâ
}
}äžäœåææäœã䜿çšããã«ã¯ãâsoupNameâ ãä»ããŠå¿
èŠãªããŒãã«ãèšå®ããŸãããã®å Žåã®åå㯠âcontactsâ ã§ããâtargetâ ãš âoptionsâ ã䜿çšããŠãåæããé
ç®ãæå®ããŸããâmergeModeâ ã¯ãã®å ŽåãâLEAVE_IF_CHANGEDâ ã«èšå®ãããŠããŸãããµãŒããŒã¬ã³ãŒãã該åœã®ã¯ã©ã€ã¢ã³ãã«äžäœåæãããåŸã«å€æŽãããå Žåãããã«ããããµãŒããŒãšã¯ã©ã€ã¢ã³ãã¬ã³ãŒãã®äž¡æ¹ãçŸåšã®ç¶æ
ã®ãŸãŸä¿æãããŸãã
iOS ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã§ã® Mobile Sync ã®äœ¿çš
äžäœåæ
Mobile Sync ã«ã¯ãSalesforce ã¬ã³ãŒãã SmartStore ã¹ãŒãã«ããŠã³ããŒãããããã®ããŸããŸãªãªãã·ã§ã³ããããŸãã
äžäœåæèšå®ãå®è¡ããã«äœæã§ããŸãã
var syncState = syncManager.createSyncDown(target: target, options: options,
soupName: CONTACTS_SOUP, syncName: syncState.syncName)ãŸãã¯ããªãã·ã§ã³ã䜿çšããã«ååã®ãªãäžäœåææäœãäœæããŠå®è¡ããããšãã§ããŸããããã®å Žåããã¹ãŠã®ããŒã«ã«ãªå€æŽãäžæžããããããšã«æ³šæããŠãã ããã
var syncState = syncManager.syncDown(target: target, soupName: CONTACTS_SOUP, onUpdate:updateFunc)
ããã«è©³çްã«å¶åŸ¡ããã«ã¯ãç¬èªã®ãªãã·ã§ã³ã䜿çšãããååã®ãªãäžäœåæèšå®ãäœæããŠå®è¡ã§ããŸãã
var syncState = syncManager.syncDown(target: target, options: options,
soupName: CONTACTS_SOUP, onUpdate:updateFunc)ãŸãã¯ãäžäœåæèšå®ãäœæããååãä»ããŠãå®è¡ã§ããŸãã
var syncState = try syncManager.syncDown(target: target, options: options,
soupName: CONTACTS_SOUP, syncName: syncState.syncName, onUpdate:updateFunc)SyncTarget ã¯ã©ã¹ã§ã¯ãSOQLãSOSLããŸã㯠MRU ã¯ãšãªæååããã¿ãŒã²ãããªããžã§ã¯ããäœæããããã®ãã¡ã¯ããªãŒã¡ãœãããæäŸãããŸããSOQL ãŸã㯠SOSL ã¯ãšãªæååã䜿çšããå Žåã¯ãããŠã³ããŒããããªããžã§ã¯ããæå®ããŸããMRU ã¯ãšãªã¿ãŒã²ããã䜿çšããå Žåã¯ãé
ç®åã®ãªã¹ãã®ã¿ãæå®ããŸããMobile SDK ã¯ãã³ãŒã«ããã¯ã¡ãœãããŸãã¯å®è£
ããæŽæ°ãããã¯ã䜿çšããŠåææäœã®é²è¡ç¶æ³ãã¬ããŒãããŸãã
iOS ãã€ãã£ãã®å ŽåãmergeMode ãªãã·ã§ã³ã«ã¯æ¬¡ã®ããããã®å€ã䜿çšããŸãã
SFSyncStateMergeModeOverwriteâ 倿ŽãããããŒã«ã«ã¬ã³ãŒããäžæžãããããŒã«ã«ã®å€æŽããã¹ãŠæ¶å»ããŸããSFSyncStateMergeModeLeaveIfChangedâ ãã¹ãŠã®ããŒã«ã«ã®å€æŽãšããŒã«ã«ã§å€æŽãããã¬ã³ãŒããä¿æããŸãã
äžäœåæ
äžäœåæã§ã¯ãMobile Sync ã¯ãäœæãæŽæ°ãåé€ãããã¹ãŒãã¬ã³ãŒãããµãŒããŒäžã«è€è£œããŸããMobile SDK ã§ã¯ãç¬èªã®ã¿ãŒã²ãããæå®ãã代ããã«äœ¿çšã§ããããã©ã«ãã®ã¿ãŒã²ãããæäŸãããŸããããã©ã«ãã¿ãŒã²ããã¯åçŽã«ãSalesforce API ã䜿çšããŠã倿Žããããã¹ãŠã®ã¬ã³ãŒããã¹ãŒããããµãŒããŒã«åæããã ãã§ãã
ã¿ãŒã²ãããããå Žåã¯ãäžäœåæèšå®ãå®è¡ããã«äœæã§ããŸãã
let syncState = syncManager.createSyncUp(target: target, options: options,
soupName: CONTACTS_SOUP, syncName: syncState.syncName)次㮠MobileSyncManager ã¡ãœããã«ã¯ããã©ã«ãã®ã¿ãŒã²ãããå©çšã§ããŸãã
let syncState = syncManager.syncUp(options: options, soupName: CONTACTS_SOUP,
onUpdate: updateFunc)ã«ã¹ã¿ãã€ãºãããäžäœåæã¿ãŒã²ãããããå Žåã¯ããã®ã¡ãœãããã³ãŒã«ããŠå®è¡ã§ããŸãã
let syncState = syncManager.syncUp(target: target, options: options,
soupName: CONTACTS_SOUP, onUpdate: updateFunc)ãŸãã¯ãåææäœãäœæããååãä»ããŠãå®è¡ã§ããŸãã
let syncState =
try syncManager.syncUp(target: target, options: options,
soupName: CONTACTS_SOUP, syncName: syncState.syncName,
onUpdate: updateFunc)ååæ
éèŠãªã®ã«èŠéããããã¡ãªã®ã¯ãååæã¡ãœããã¯çšéãåºããç°¡åã«ã³ãŒãã£ã³ã°ã§ãããšããããšã§ãããããã®ã¡ãœããã¯ãå¥ã®å Žæã§ä»¥åã«å®çŸ©ããåæèšå®ãå®è¡ããŸããååæãšããååã«ããããããããããã®ã¡ãœããã䜿çšããŠååä»ãåæãæåã«å®è¡ããããšãã§ããŸããååæã¡ãœããã¯ãååã®åæåŸã«äœæãŸãã¯æŽæ°ãããã¬ã³ãŒãã®ã¿ãåæããŸããåæãäžåºŠãå®è¡ãããŠããªãå Žåã¯ãååæã«ãã£ãŠãã¹ãŠã®æ°ããã¬ã³ãŒããšå€æŽãããã¬ã³ãŒããã³ããŒãããŸãããã以å€ã®å Žåã¯ãå¢ååæãå®è¡ãããŸãã
ååæã¡ãœããã䜿çšããã«ã¯ã以åã®åæã®åæ ID ãŸãã¯å®çŸ©æžã¿ã®åæåãæå®ããŸããæ¢åã®ååä»ãåæã¯æ¬¡ã®ããã«å®è¡ããŸãã
var syncState =
try syncManager.reSync(named:
syncState.syncName
, onUpdate: updateFunc)以åã®ååã®ãªãåææäœã§è¿ããã SFSyncState.syncId å€ããã£ãã·ã¥ããŠããå Žåã«ã¯ãããã䜿çšããŠãã®åæãåå®è¡ã§ããŸãã
var syncState =
try syncManager.reSync(id:
syncState.syncId
, onUpdate: updateFunc)reSync ã¡ãœããã§ã¯ãäžäœåæèšå®ãšäžäœåæèšå®ã®äž¡æ¹ããµããŒããããŠããŸãã
äŸ
forceios ã«ãã£ãŠäœæããã Native Swift ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãSmartStore ãš Mobile Sync ã®åºæ¬æ©èœã瀺ããã³ãã¬ãŒãã䜿çšãããŸããã³ãŒããç°¡ç¥åããããã«ããã®ãã³ãã¬ãŒãã§ã¯ SmartStore ãš Mobile Sync ã® Combine ãããªãã·ã£ãŒã䜿çšãããŸãããããã®ãããªãã·ã£ãŒã¯ãSmartStore ã¯ã©ã¹ãš MobileSync ã¯ã©ã¹ã®æ¡åŒµãšã㊠Mobile SDK ã§äœ¿çšã§ããŸããããã iOSNativeSwiftTemplate ãããžã§ã¯ãã§å®è£ ãããšã©ããªãããèŠãŠã¿ãŸãããã
æåã«ããã®å®è£ ã«äœ¿çšããã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
- ã¿ãŒããã«ãŠã£ã³ããŠã§ãforceios ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
- ã¢ããªã±ãŒã·ã§ã³çš®å¥ã«ã¯
native_swiftã䜿çšããŸãã - ã¢ããªã±ãŒã·ã§ã³ã«
offlineSwiftãšååãä»ããŸãã
- forceios ãå®äºããããXcode ã§æ°ããã¯ãŒã¯ã¹ããŒã¹ãéããŸãã
Xcode ã§ããªãã©ã€ã³æ©èœã®ã»ããã¢ãããšèšå®ã確èªããŸãã
- ãããžã§ã¯ãããã²ãŒã¿ãŒ (â1) ã§ã[offlineSwift] > [offlineSwift] > [Supporting Files (ãµããŒããã¡ã€ã«)] ãå±éããŸããããã«
userstore.jsonãã¡ã€ã«ãšusersyncs.jsonãã¡ã€ã«ããããŸãããšãã£ã¿ãŒã§ãããã®ãã¡ã€ã«ãéããšãååŒå ã¬ã³ãŒãã®ã¢ã¯ã»ã¹ãšå®çŸ©ã®åºæ¬èšå®ãå®çŸ©ãããŠããããšãããããŸãã - ãã³ãã¬ãŒãã«ãã£ãŠ
userstore.jsonãšusersyncs.jsonããããžã§ã¯ãã® [Build Phases (ãã§ãŒãºã®äœæ)] èšå®ã®ã¢ããªã±ãŒã·ã§ã³ãã³ãã«ã«è¿œå ãããŸãã
- Xcode ãããžã§ã¯ãããã²ãŒã¿ãŒã§ããããžã§ã¯ãããŒããéžæããŸãã
- ãšãã£ã¿ãŒãŠã£ã³ããŠã§ã[Build Phases (ãã§ãŒãºã®äœæ)] ãéžæããŸãã
- [Copy Bundle Resources (ãã³ãã«ãªãœãŒã¹ã®ã³ããŒ)] ãå±éããŸãã
userstore.jsonãšusersyncs.jsonã衚瀺ãããŸããã€ãŸããã¢ããªã±ãŒã·ã§ã³ã®äœææã«ããããã¢ããªã±ãŒã·ã§ã³ãã³ãã«ã«è¿œå ãããŸãã
ã§ã¯ãã³ãŒãã詳ããèŠãŠã¿ãŸãããã
- ãããžã§ã¯ãããã²ãŒã¿ãŒã§ã[offlineSwift] > [offlineSwift] > [Classes (ã¯ã©ã¹)] > [SwiftUI] ãå±éããŸãã
SceneDelegate.swiftã§ããªãã©ã€ã³èšå®ãã¡ã¢ãªã«èªã¿èŸŒãsetupRootViewController()颿°ããã³ãã¬ãŒãã«ãã£ãŠè¿œå ãããŸãããã®é¢æ°ã¯ãŠãŒã¶ãŒã»ãã·ã§ã³ããšã«äžåºŠã ãæå³çã«ã³ãŒã«ãããŸãããã®èšå®ã¡ãœãã㯠1 ã€ã®ã»ãã·ã§ã³ã§è€æ°åã³ãŒã«ã§ããŸããããŸãã¯ç°ãªãèšå®ãèªã¿èŸŒãããã«äœ¿çšã§ããŸããã// Set up store based on config userstore.json MobileSyncSDKManager.shared.setupUserStoreFromDefaultConfig() // Set up syncs based on config usersyncs.json MobileSyncSDKManager.shared.setupUserSyncsFromDefaultConfig()
- ãããžã§ã¯ãããã²ãŒã¿ãŒã§ã[offlineSwift] > [offlineSwift] > [Classes (ã¯ã©ã¹)] > [Models (ã¢ãã«)] ãå±éããŸãã
AccountsListModel.swiftã§ãAccountsListModelã¯ã©ã¹ã® 1 è¡ç®ãèŠãŠãã ããããã®è¡ã¯ãååŒå ãªããžã§ã¯ãã®ç©ºã®ãããªãã·ã¥æžã¿é åãå®çŸ©ããŸããã¢ããªã±ãŒã·ã§ã³ã® SwiftUI ãªããžã§ã¯ãã¯ããããªãã·ã¥æžã¿é åã倿Žããããšãã«æŽæ°ãåä¿¡ããããã«AccountsListModelã«ãµãã¹ã¯ã©ã€ãããŸãã/** ViewModel for Account List */ class AccountsListModel: ObservableObject { @Published var accounts: [Account] = [] ...fetchAccounts()颿°ãèŠã€ããŸããããã§ãMobile Sync ãããªãã·ã£ãŒãfunc fetchAccounts(){ syncTaskCancellable = syncManager?.publisher(for: "syncDownAccounts") .receive(on: RunLoop.main) .sink(receiveCompletion: { _ in }, receiveValue: { _ in self.loadFromSmartStore() }) self.loadFromSmartStore() }usersyncs.jsonã§å®çŸ©ãããååä»ãåææäœ "syncDownAccounts" ãåããååæããŸããæ¬¡ã«ãããªãã·ã£ãŒã¯è¿ãããããŒã¿ãããã©ã«ãã® SmartStore ã¹ãã¢ã«ããã¹ãŒãã«ã³ããŒããŸããfetchAccounts()ããããªãã·ã£ãŒããå¿çãåä¿¡ãããšãloadFromSmartStore()ãã³ãŒã«ããŠãSmartStore ã®æŽæ°ãããããŒã¿ããããªãã·ã¥æžã¿ã®accountsé åã«éåæã§ã³ããŒããŸããå¿çã®åä¿¡ãåŸ ã£ãŠããéãfetchAccounts()ã¯loadFromSmartStore()ãã³ãŒã«ããŠãaccountsé åã«ããŒã«ã«ã®å€æŽãé©çšãããŠããããšã確èªããŸããã§ã¯ãloadFromSmartStore()ããã®æŽæ°ãã©ãå®è¡ããããèŠãŠã¿ãŸããããloadFromSmartStore()颿°ã¯ãSmartStore ãããªãã·ã£ãŒã䜿çšã㊠Smart SQL ã¯ãšãªãçºè¡ããéåæå¿çãåä¿¡ããŸããå¿çãæåã瀺ãå Žåã颿°ã¯çµæã®ããŒã¿ã»ãããã³ãŒã«å ã«ãããªãã·ã¥ããŸããããã§ãã³ãŒã«å ãè§£ææžã¿ã®å¿çãAccountsListModelãªããžã§ã¯ãã®accountsé åã«ã³ããŒããŸããÂimport MobileSync ... private func loadFromSmartStore() { storeTaskCancellable = self.store?.publisher(for: "select {Account:Name}, {Account:Industry}, {Account:Id} from {Account}") .receive(on: RunLoop.main) .tryMap { $0.map { (row) -> Account in let r = row as! [String?] return Account(id: r[2] ?? "", name: r[0] ?? "", industry: r[1] ?? "Unknown Industry" ) } } .catch { error -> Just<[Account]> in print(error) return Just([Account]()) } .assign(to: \AccountsListModel.accounts, on:self) }Â
accounts é åãå ¥åãããããã¢ããªã±ãŒã·ã§ã³ã¯ãã©ã€ããªããžãã¯ããã®å Žåã¯æ¬¡ã®æäœã«é²ãããšãã§ããŸãã
- ç
§äŒãããååŒå
ãšãã®è©³çްã衚瀺ãã
- 顧客ãéžæããååŒå
ã«ã€ããŠç
§äŒããååŒå
責任è
ãšãã®è©³çްã衚瀺ããã
Android ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã§ã® Mobile Sync ã®äœ¿çš
äžäœåæ
ãµãŒããŒããããŒã«ã«ã® Mobile Sync ã¹ãŒãã« sObject ãããŠã³ããŒãããã«ã¯ã次ã®ããããã® SyncManager ã¡ãœããã䜿çšããŸãã
äžäœåæèšå®ãå®è¡ããã«äœæã§ããŸãã
public SyncState createSyncDown(SyncDownTarget target,
SyncOptions options, String soupName, String syncName)
throws JSONException;ãŸãã¯ããªãã·ã§ã³ã䜿çšããã«ååã®ãªãäžäœåææäœãäœæããŠå®è¡ããããšãã§ããŸããããã®å Žåããã¹ãŠã®ããŒã«ã«ãªå€æŽãäžæžããããããšã«æ³šæããŠãã ããã
public SyncState syncDown(SyncDownTarget target, String soupName,
SyncUpdateCallback callback) throws JSONException;ããã«è©³çްã«å¶åŸ¡ããã«ã¯ãç¬èªã®ããŒãžãªãã·ã§ã³ã䜿çšãããååã®ãªãäžäœåææäœãäœæããŠå®è¡ã§ããŸãã
public SyncState syncDown(SyncDownTarget target, SyncOptions options, Â Â String soupName, SyncUpdateCallback callback) Â Â throws JSONException;
ãŸãã¯ãäžäœåæèšå®ãäœæãããšãã«ååãä»ããŠããå®è¡ããããšãã§ããŸãã
public SyncState syncDown(SyncDownTarget target, SyncOptions options,
String soupName, SyncUpdateCallback callback)
throws JSONException;äžäœåæ
ããŒã«ã«ã®å€æŽããµãŒããŒã«é©çšããã«ã¯ã次ã®ããããã® SyncManager ã¡ãœããã䜿çšããŸãã
- äžäœåæèšå®ãå®è¡ããã«äœæã§ããŸãã
public SyncState createSyncUp(SyncUpTarget target, SyncOptions options, String soupName, String syncName) throws JSONException; - 1 åã®ã³ãŒã«ã§ãååã®ãªãåæèšå®ãäœæããŠå®è¡ã§ããŸãã
public SyncState syncUp(SyncUpTarget target, SyncOptions options, String soupName, SyncUpdateCallback callback) throws JSONException; - ãŸãã¯ã1 åã®ã³ãŒã«ã§ãååä»ãäžäœåæèšå®ãäœæããŠå®è¡ã§ããŸãã
public SyncState syncUp(SyncUpTarget target, SyncOptions options, String soupName, String syncName, SyncUpdateCallback callback) throws JSONException;
syncUp ã¡ãœããã¯ãæå®ãã SmartStore ã¹ãŒãã®ããŒã¿ã§ãµãŒããŒãæŽæ°ããŸãããã®ã¡ãœããã¯ã¹ãŒãå
ã®äœæãæŽæ°ããŸãã¯å逿žã¿ã®ã¬ã³ãŒããæ€çŽ¢ããŠããã®å€æŽããµãŒããŒã«è€è£œããŸããtarget ãš options ã®ãããããŸãã¯äž¡æ¹ã¯ãæŽæ°ããé
ç®ã®ãªã¹ããæå®ããŸããtarget ã§ã¯ãã¬ã³ãŒããäœæãã createFieldlist ãšæ¢åã®ã¬ã³ãŒããæŽæ°ãã updateFieldlist ãåºå¥ã§ããŸãããããã®èšå®ã«ãã£ãŠãæ¢åã®ã¬ã³ãŒãã®åç
§ã®ã¿ã®é
ç®ãæŽæ°ããªãããã«ããªããæ°ããã¬ã³ãŒããåæã§ããŸããtarget é
ç®ãªã¹ããš options é
ç®ãªã¹ããå®çŸ©ãããšãoptions èšå®ã¯ç¡èŠãããŸãã
ååæ
éèŠãªã®ã«èŠéããããã¡ãªã®ã¯ã2 ã€ã®ååæã¡ãœããã¯çšéãåºããç°¡åã«ã³ãŒãã£ã³ã°ã§ãããšããããšã§ãããããã®ã¡ãœããã¯ãå¥ã®å Žæã§ä»¥åã«å®çŸ©ããåæèšå®ãå®è¡ããŸããååæãšããååã«ããããããããããã®ã¡ãœããã䜿çšããŠååä»ãåæãæåã«å®è¡ããããšãã§ããŸããåŸç¶ã®å®è¡ã§ã¯ãååæã¡ãœããã¯ãåã®åæåŸã«äœæãŸãã¯æŽæ°ãããã¬ã³ãŒãã®ã¿ãåæããŸããåæãäžåºŠãå®è¡ãããŠããªãå Žåã¯ãååæã«ãã£ãŠãã¹ãŠã®æ°ããã¬ã³ãŒããšå€æŽãããã¬ã³ãŒããã³ããŒãããŸãããã以å€ã®å Žåã¯ãå¢ååæãå®è¡ãããŸãã
ååæã¡ãœããã䜿çšããã«ã¯ã以åã®åæã®åæ ID ãŸãã¯å®çŸ©æžã¿ã®åæåãæå®ããŸããååä»ãåæã¯æ¬¡ã®ããã«å®è¡ããŸãã
public SyncState reSync(String syncName, SyncUpdateCallback callback)
throws JSONException;以åã®åææäœã§è¿ããã SFSyncState.syncId å€ããã£ãã·ã¥ããŠããå Žåã«ã¯ãreSync:updateBlock: ã䜿çšããŠãã®åæãåå®è¡ã§ããŸãã
public SyncState reSync(long syncId, SyncUpdateCallback callback)
throws JSONException;reSync ã¡ãœããã§ã¯ãäžäœåæèšå®ãšäžäœåæèšå®ã®äž¡æ¹ããµããŒããããŠããŸãã
äŸ
Android ã®å ŽåãMobileSyncExplorerKotlinTemplate ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã¯ãContact ã¬ã³ãŒãã«ååä»ãåæããã³åæèšå®ãã¡ã€ã«ã䜿çšããæ¹æ³ã瀺ããŸãããã®ãµã³ãã«ã§ã¯ Salesforce Contact ã¬ã³ãŒãã Java ãªããžã§ã¯ããšããŠè¡šã ContactObject ã¯ã©ã¹ãå®çŸ©ããŸããContact ããŒã¿ã SmartStore ã¹ãŒããšäžäœåæããããã«ãsyncDown() ã¡ãœããã¯ãSOQL ã¯ãšãªãå®çŸ©ããååä»ãäžäœåæèšå®ãååæããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ãuserstore.json ãã¡ã€ã«ãš usersyncs.json ãã¡ã€ã«ã /res/raw ãããžã§ã¯ããã©ã«ããŒã«ä¿åããŸãã以äžã¯ userstore.json ã§ãã
{
"soups": [
{
"soupName": "contacts",
"indexes": [
{ "path": "Id", "type": "string"},
{ "path": "FirstName", "type": "string"},
{ "path": "LastName", "type": "string"},
{ "path": "__local__", "type": "string"},
{ "path": "__locally_created__", "type": "string"},
{ "path": "__locally_updated__", "type": "string"},
{ "path": "__locally_deleted__", "type": "string"},
{ "path": "__sync_id__", "type": "integer"}
]
}
]
}以äžã¯ usersyncs.json ã§ãã
{
"syncs": [
{
"syncName": "syncDownContacts",
"syncType": "syncDown",
"soupName": "contacts",
"target": {"type":"soql", "query":"SELECT FirstName, LastName, Title, MobilePhone, Email, Department, HomePhone FROM Contact LIMIT 10000"},
"options": {"mergeMode":"OVERWRITE"}
},
{
"syncName": "syncUpContacts",
"syncType": "syncUp",
"soupName": "contacts",
"target": {"createFieldlist":["FirstName", "LastName", "Title", "MobilePhone", "Email", "Department", "HomePhone"]},
"options": {"fieldlist":["Id", "FirstName", "LastName", "Title", "MobilePhone", "Email", "Department", "HomePhone"], "mergeMode":"LEAVE_IF_CHANGED"}
}
]
}ãã®ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã¯ããããã®ãã¡ã€ã«ã ContactsRepo ã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¡ã¢ãªã«èªã¿èŸŒã¿ãŸãã
class DefaultContactsRepo(
account: UserAccount,
ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : SObjectSyncableRepoBase<ContactObject>(account = account, ioDispatcher = ioDispatcher) {
âŠ
init {
MobileSyncSDKManager.getInstance().apply {
setupUserStoreFromDefaultConfig()
setupUserSyncsFromDefaultConfig()
}
}
âŠ
}ContactsRepo ã¯ã©ã¹ããã®æ¬¡ã®ã¡ãœããã§ãããŒã«ã«ã® doSyncDown() ã¡ãœãã㯠syncDownContacts èšå®ã䜿çšã㊠suspendReSync() ãå®è¡ããŸãã
@Throws(SyncDownException::class)
private suspend fun doSyncDown(): SyncState {
try {
return syncManager.suspendReSync(syncDownName)
} catch (es: SyncManager.ReSyncException.FailedToStart) {
throw SyncDownException.FailedToStart(cause = es)
} catch (ef: SyncManager.ReSyncException.FailedToFinish) {
throw SyncDownException.FailedToFinish(cause = ef)
}
}äžäœåææäœãæåããå Žåãã€ãŸã sync.getStatus() ã Status.DONE ã®å Žåã¯ãåä¿¡ããããŒã¿ãæå®ãããã¹ãŒãã«åã蟌ãŸããŸãããã®åŸãã³ãŒã«ããã¯ã¡ãœããã¯ãContact ãªã¹ãã®ããŒã¿ãåèªã¿èŸŒã¿ããã€ã³ãã³ããèµ·åããŸãã
åæ§ã«ãContactListLoader ã®ããŒã«ã«ã® syncUp() ã¡ãœãã㯠syncUpContacts èšå®ã䜿çšã㊠reSync() ãå®è¡ããŸãã
@Throws(SyncUpException::class)
private suspend fun doSyncUp(): SyncState {
try {
return syncManager.suspendReSync(syncUpName)
} catch (es: SyncManager.ReSyncException.FailedToStart) {
throw SyncUpException.FailedToStart(cause = es)
} catch (ef: SyncManager.ReSyncException.FailedToFinish) {
throw SyncUpException.FailedToFinish(cause = ef)
}
}éåæå¿çã Status.DONE ãè¿ããšãããã§ ContactsActivityViewModel å®è£
㯠syncDown() ãã³ãŒã«ãã远å ã¹ããããå®è¡ããŸãããã®æšå¥šã¹ãããã«ãããSmartStore ã¹ãŒãã«ãµãŒããŒã§ã® Contact ãžã®æè¿ã®å€æŽããã¹ãŠåæ ãããææ°ã®ç¶æ
ã§ããããšãä¿èšŒãããŸãã
val syncUpSuccess = try {
contactsRepo.syncUp()
true
} catch (ex: SyncUpException) {
logger.e(TAG, ex.toString())
when (ex) {
is SyncUpException.FailedToFinish -> SyncUpFinishFailed
is SyncUpException.FailedToStart -> SyncUpStartFailed
}.also {
mutMessages.tryEmit(it)
}
false
}
if (syncUpSuccess) {
try {
contactsRepo.syncDown()
} catch (ex: SyncDownException) {
logger.e(TAG, ex.toString())
when (ex) {
is SyncDownException.CleaningUpstreamRecordsFailed -> CleanGhostsFailed
is SyncDownException.FailedToFinish -> SyncDownFinishFailed
is SyncDownException.FailedToStart -> SyncDownStartFailed
}.also {
mutMessages.tryEmit(it)
}
} catch (ex: RepoOperationException.SmartStoreOperationFailed) {
logger.e(TAG, ex.toString())
mutMessages.tryEmit(RepoRefreshFailed)
}
}éåæå¿çã Status.DONE ãè¿ããšãããã§ SyncUpdateCallback å®è£
㯠syncDown() ãã³ãŒã«ãã远å ã¹ããããå®è¡ããŸãããã®æšå¥šã¹ãããã«ãããSmartStore ã¹ãŒãã«ãµãŒããŒã§ã® Contact ãžã®æè¿ã®å€æŽããã¹ãŠåæ ãããææ°ã®ç¶æ
ã§ããããšãä¿èšŒãããŸãã
ãã€ããªããã¢ããªã±ãŒã·ã§ã³ã§ã® Mobile Sync ã®äœ¿çš
Mobile Sync ã«ã¯ããã€ããªããã¢ããªã±ãŒã·ã§ã³åãã« 2 ã€ã®ç°ãªãæ¹æ³ãçšæãããŠããŸãã
com.salesforce.plugin.mobilesyncâ ãã® Cordova ãã©ã°ã€ã³ã¯ãMobile Sync ã®ãã€ãã£ããªãäžäœåæãããã³ãäžäœåæãæ©èœãžã® JavaScript ã¢ã¯ã»ã¹ãæäŸããŸãããã®ãããããã©ãŒãã³ã¹éçŽçãªæäœ (ãããã¯ãŒã¯ããŽã·ãšãŒã·ã§ã³ãè§£æãSmartStore 管çãªã©) ããã€ãã£ãã¹ã¬ããäžã§å®è¡ãããWeb ãã¥ãŒã®æäœã«åœ±é¿ãäžããŸãããWeb ãã¥ãŒã§ã¯ãªããã€ãã£ãã¹ã¬ããã§å€§éã®ã¬ã³ãŒããè¿ éã«åæãããªã©ãæ¯èŒçåçŽãªã·ããªãªã§ã¯ãã©ã°ã€ã³ã䜿çšããŸããmobilesync.jsâ ãã® JavaScript ã©ã€ãã©ãªã¯ãããè€éãªåææäœã®ããã« Force SObject ããŒã¿ãã¬ãŒã ã¯ãŒã¯ãæäŸããŸãããã®ã©ã€ãã©ãªã¯ãæ¡åŒµæ§ã®é«ãããŒã¿ã¢ããªã³ã°ã¡ã«ããºã ãå®çŸ©ãããªãŒãã³ãœãŒã¹ã® JavaScript ãã¬ãŒã ã¯ãŒã¯ã§ãã Backbone.js ãããŒã¹ã«ããŠããŸããmobilesync.jsã䜿çšãããšãSalesforce ãªããžã§ã¯ãã®ã¢ãã«ãäœæã§ãããã®ã¢ãã«ã®ããŒã¿ã倿Žããã ãã§åºç€ãšãªãã¬ã³ãŒããæäœã§ããŸããSOQL ãŸã㯠SOSL ã¯ãšãªãå®è¡ãããšãJSON æååãšããŠã§ã¯ãªãã¢ãã«ã³ã¬ã¯ã·ã§ã³ã§çµæã¬ã³ãŒããååŸãããŸãã
é«ã广ãåŸãããã«ãåãã¢ããªã±ãŒã·ã§ã³å
ã§ãããã®æ¹æ³ãçµã¿åãããããšãã§ããŸããããšãã°ããã©ã°ã€ã³ã¯ãsyncDown() ãš syncUp() ã® 2 ã€ã®ã¡ãœãããå
¬éããŸãããããã®ã¡ãœããã䜿çšããå Žåãæ¬¡ã®ã¬ã€ãã©ã€ã³ã«åŸããšäœæ¥ãç°¡åã«ãªããŸãã
- SmartStore ã¹ãŒãã®ã¬ã³ãŒããäœæãæŽæ°ãåé€ããã«ã¯ã
mobilesync.jsã®Force.SObjectã䜿çšããŸããmobilesync.jsã©ã€ãã©ãªã¯ããã©ã°ã€ã³ãæ³å®ããç¹å¥ãªé ç®ãã¹ãŒãã¬ã³ãŒãäžã«èªåçã«äœæããŸãããã®åŸããã©ã°ã€ã³ã§syncUp()ãã³ãŒã«ããŠããµãŒããŒãæŽæ°ã§ããŸãã - åæ§ã«ãåææäœã§äœ¿çšããã¹ãŒããäœæããã«ã¯ã
mobilesync.jsã®Force.StoreCacheã䜿çšããŸãã - ã¹ãŒãã®ãªããžã§ã¯ãã倿ŽããŠããå Žåã¯ã
syncDown()ãã³ãŒã«ããåã«å¿ ãsyncUp()ãã³ãŒã«ããŸãã
forcehybrid ã䜿çšããŠäœæããããã€ããªããã¢ããªã±ãŒã·ã§ã³ã«ã¯ãMobile Sync ãã©ã°ã€ã³ãèªåçã«å«ãŸããŸãã
äžäœåæ
以äžã¯ãMobile Sync ãã©ã°ã€ã³ã® syncDown() ã¡ãœããã§ãã
cordova.require("com.salesforce.plugin.mobilesync").syncDown
([storeConfig,] target, soupName, options, [syncName,] success, error);ãã®èšå®ã®åæåãå®çŸ©ãããŠããå Žåã¯ããã®åæåãæå®ã§ããŸããåæåã¯ãWeb ã¢ããªã±ãŒã·ã§ã³ã®æäžäœã«å«ãã usersyncs.json èšå®ãã¡ã€ã«ã§å®çŸ©ããŸãã
ãã€ããªããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããŒãžã¢ãŒããªãã·ã§ã³ã«æ¬¡ã®èå¥åã䜿çšããŸãã
{mergeMode:Force.MERGE_MODE_DOWNLOAD.OVERWRITE}(ããã©ã«ã){mergeMode:Force.MERGE_MODE_DOWNLOAD.LEAVE_IF_CHANGED}
success ãã©ã¡ãŒã¿ãŒã¯ãåææäœäžã«è€æ°åã³ãŒã«ãããã³ãŒã«ããã¯é¢æ°ãæå®ããŸãã
- åææäœã®éå§æ
- å
éš REST èŠæ±ã®å®äºæ
- çµæã®åããŒãžãããŠã³ããŒãåŸ (ãã¹ãŠã®çµæãåä¿¡ãããŸã§)
åææäœã®å®è¡äžã«ãç¶æ³æŽæ°ããã©ãŠã¶ãŒã€ãã³ãã«ãã£ãŠéç¥ãããŸãããããã®æŽæ°ããªã¹ã³ããã«ã¯ã次ã®ã€ãã³ããªã¹ããŒãå®è£ ããŸãã
document.addEventListener("sync",
function(event)
{
// event.detail contains the status of the sync operation
}
);event.detail ã¡ã³ããŒã¯ãåæã¡ã¿ããŒã¿ãšãããã«éèŠãªæäœã®çŸåšã®é²è¡ç¶æ³ãšç¶æ³ã«ã€ããŠã®æ å ±ãæäŸããŸãã
syncIdâ ãã®åææäœã® IDtypeâsyncDowntargetâ æå®ããã¿ãŒã²ããsoupNameâ æå®ããã¹ãŒãåoptionsâ æå®ãããªãã·ã§ã³ã®é åstatusâ åæç¶æ³ (次ã®ãããã)
NEWRUNNINGDONEFAILED
progressâ çŸæç¹ã§åŠçæžã¿ã®åèšã¬ã³ãŒãã®å²å (æŽæ°ã0 ïœ 100%)totalSizeâ çŸæç¹ã§åŠçæžã¿ã®ã¬ã³ãŒãæ°
åæ ID ãä¿åããŠããããšããå§ãããŸããåŸã§ããã®å€ã䜿çšããŠåææäœãåå®è¡ã§ããŸãã
äžäœåæ
Mobile Sync ãã©ã°ã€ã³ã® syncUp() ã¡ãœããã¯ãäœæãåé€ããŸãã¯æŽæ°æžã¿ã®ã¬ã³ãŒãã SmartStore ã¹ãŒããã Salesforce ãµãŒããŒã«è€è£œããŸãã
cordova.require("com.salesforce.plugin.mobilesync").syncUp
([storeConfig,] [target,] soupName, options, [syncName,] successCb, errorCb);æäœã«ã€ããŠã次ã®ãããªèšå®ãæå®ããŸãã
targetâ ã«ã¹ã¿ã ãã€ãã£ãäžäœåæã¿ãŒã²ãããå®çŸ©ãããŠããå Žåã¯ããã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠãã®ã¯ã©ã¹ãèå¥ããŸãsyncNameâ ãã®èšå®ã®åæåãå®çŸ©ãããŠããå Žåã¯ããã®åæåãæå®ã§ããŸããåæåã¯ãWeb ã¢ããªã±ãŒã·ã§ã³ã®æäžäœã«å«ããusersyncs.jsonèšå®ãã¡ã€ã«ã§å®çŸ©ããŸããoptionsâ æ¬¡ã®ããŒãšã®å¯Ÿå¿ä»ããæå®ããŸã
fieldlistâ ãµãŒããŒã«éä¿¡ãããé ç®ã®ãªã¹ã
successCbãerrorCbâ æåãšãšã©ãŒã®ã³ãŒã«ããã¯é¢æ°
åææäœã®ç¶æ³æŽæ°ã¯ãsyncDown ã«å®è£ ããã®ãšåãã€ãã³ããã³ãã©ãŒã«ãã£ãŠéç¥ãããŸãã
document.addEventListener("sync",
function(event)
{
// event.detail contains the status of the sync operation
}
);äžäœåææäœãšåæ§ãevent.detail ã¡ã³ããŒã¯ãåæã¡ã¿ããŒã¿ãæäŸããæäœã®çŸåšã®é²è¡ç¶æ³ãšç¶æ³ã«ã€ããŠã®ã¬ããŒãã衚瀺ããŸãã
ååæ
ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãšåæ§ã«ãreSync ã¡ãœããã¯éåžžã«åªããæè»æ§ãšããã©ãŒãã³ã¹ãæäŸããã³ãŒãã£ã³ã°ãããããããŸããæå®ããåæåããããŸã§åæãããŠããªãå ŽåãreSync() ã¯å®å
šãªåæãå®è¡ããŸãããã§ã«åæãããããšãããå Žåã¯ãæ°èŠã¬ã³ãŒãã倿Žãããã¬ã³ãŒããåé€ãããã¬ã³ãŒãã®ã¿ã®å¢ååæãå®è¡ãããŸãã
cordova.require("com.salesforce.plugin.mobilesync").reSync([storeConfig], syncIdOrName, successCB, errorCB)æäœã«ã€ããŠã次ã®ãããªèšå®ãæå®ããŸãã
syncIdOrNameâ ãã®åææäœã® ID ãŸãã¯usersyncs.jsonãã¡ã€ã«ã®åæåãsuccessCbãerrorCbâ æåãšãšã©ãŒã®ã³ãŒã«ããã¯é¢æ°
äŸ
ãã®äŸã§ã¯ã次㮠usersyncs.json ãã¡ã€ã«ã§å®çŸ©ãããååä»ãåæã䜿çšããŸããå®å
šãªãœãŒã¹ã³ãŒã㯠SalesforceMobileSDK-Shared ã® GitHub ãªããžããªã«ãããŸãã
{
"syncs": [
{
"syncName": "syncDownContacts",
"syncType": "syncDown",
"soupName": "contacts",
"target": {"type":"soql",
"query":"SELECT FirstName, LastName, Title, MobilePhone,
Email, Department, HomePhone FROM Contact LIMIT 10000"},
"options": {"mergeMode":"OVERWRITE"}
},
{
"syncName": "syncUpContacts",
"syncType": "syncUp",
"soupName": "contacts",
"target": {
"createFieldlist":["FirstName", "LastName", "Title", "MobilePhone",
"Email", "Department", "HomePhone"]},
"options": {
"fieldlist":["Id", "FirstName", "LastName", "Title",
"MobilePhone", "Email", "Department", "HomePhone"],
"mergeMode":"LEAVE_IF_CHANGED"}
}
]
}次ã®äŸã§ã¯ãäžäœåææäœãšäžäœåææäœã®äž¡æ¹ã§ Mobile Sync Cordova ãã©ã°ã€ã³ã® reSync() ãã³ãŒã«ããåæåãæž¡ããŸãããã¹ãŠã®åææäœã¯ãæåã³ãŒã«ããã¯ã« handleSyncUpdate() 颿°ã䜿çšããŸãããã®é¢æ°ã¯ãsyncUp ãæ£åžžã«å®è¡ãããåŸã« syncDown() ãã³ãŒã«ããŸããã¹ãŒãããµãŒããŒäžã§ææ°ã®å€æŽãåæ ããããã«ãsyncUp() ã®åŸã« syncDown() ãã³ãŒã«ããããšããå§ãããŸãã
çŸåšã®åœ¢åŒã§ã¯ãsyncDown() ã®æåã³ãŒã«ããã¯ã«ãã£ãŠ UI ãšãã®ã³ã³ãã³ãããªã»ãããããŸãã
handleSyncUpdate: function(sync) {
// Called after sync operations succeed
if (sync.type === "syncDown") {
// Reset UI buttons, then search (fetch) from SmartStore
this.syncInFlight = false;
$(".sync").disabled = false;
this.search();
}
if (sync.type === "syncUp") {
this.syncDown();
}
}
},
syncDown: function() {
cordova.require("com.salesforce.plugin.mobilesync").
reSync("syncDownContacts" /* see usersyncs.json */,
this.handleSyncUpdate.bind(this));
},
syncUp: function() {
cordova.require("com.salesforce.plugin.mobilesync").
reSync("syncUpContacts" /* see usersyncs.json */,
this.handleSyncUpdate.bind(this));
}React Native ã¢ããªã±ãŒã·ã§ã³ã§ã® Mobile Sync ã®äœ¿çš
React Native ã§ã¯ãMobile Sync ã mobilesync ã¢ãžã¥ãŒã«ã«ãã£ãŠãã®æ©èœãæäŸããŸããreact-native-force ãã¡ã€ã«å
ã§ã次ã®ããã« react-native-force ã©ã€ãã©ãªãããã®ã¢ãžã¥ãŒã«ãšãã®é£åé¢ä¿ãã€ã³ããŒãã§ããŸãã
import {oauth, net, smartstore, mobilesync} from 'react-native-force';forcereact ã§äœæãããã¢ããªã±ãŒã·ã§ã³ã«ã¯ import ã¹ããŒãã¡ã³ããå«ãŸããŸãããsmartstore ã mobilesync ã¯äœ¿çšãããŸãããMobile SDK ãªãã©ã€ã³æ©èœããµããŒãããŠããå Žåã¯ããããã®ã¢ãžã¥ãŒã«ã远å ããŠãã ããã
åæèšå®
ãæšå¯ã®éããReact Native ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã€ããªããã¢ããªã±ãŒã·ã§ã³ãšåãèšå®ã¡ã¿ããŒã¿ãæå®ããŸããæ¬¡ã«ãã¿ãŒã²ãã宣èšã®äŸã瀺ããŸãã
const fieldlist = ["Id", "FirstName", "LastName",
"Title", "Email", "MobilePhone","Department",
"HomePhone", "LastModifiedDate"];
const target = {type:"soql", query:
`SELECT ${fieldlist.join(",")} FROM Contact LIMIT 10000`};options ã®ããŒãžã¢ãŒãã«ã¯ã次ã®ããããã®å€ã䜿çšããŸãã
- 倿Žãããã¬ã³ãŒããäžæžãããå Žå
{mergeMode:mobilesync.MERGE_MODE.OVERWRITE}mergeModeããŒãå®çŸ©ããªãã£ãå ŽåãMobile Sync ã¯ããã©ã«ããšããŠãã®ã¢ãŒãã䜿çšããŸãã
倿Žãããã¬ã³ãŒããäžæžãããã«ç¶æããå Žå {mergeMode:mobilesync.MERGE_MODE.LEAVE_IF_CHANGED}
äžäœåæ
React Native ã® syncDown() 颿°ã¯ããã€ããªãã颿°ãšåãã§ãããmobilesync ã¢ãžã¥ãŒã«ã§ã³ãŒã«ããããšããç¹ã®ã¿ãç°ãªããŸãããã®é¢æ°ã¯ãæå®ããã Salesforce ã¬ã³ãŒãã SmartStore ã¹ãŒãã«ããŠã³ããŒãããŸãã
mobilesync.syncDown
([storeConfig,] target, soupName, options, [syncName,] success, error);ã¹ãŒãå ã®æ¢åã®ã¬ã³ãŒãã® ID ãã¯ãšãªã«ãã£ãŠè¿ãããã¬ã³ãŒããšåãå Žåã¯ãMobile Sync ãããã©ã«ãã§éè€ããã¹ãŒãã¬ã³ãŒããäžæžãããŸããããŠã³ããŒããããããŒã¿ãšã¹ãŒãå ã®ç·šéæžã¿ã®ã¬ã³ãŒããããŒãžããæ¹æ³ãå¶åŸ¡ããã«ã¯ãoptions ãã©ã¡ãŒã¿ãŒã®ããŒãžã¢ãŒããæå®ããŸãã
success ãã©ã¡ãŒã¿ãŒã¯ãåææäœãæ£åžžã«å®äºãããšãã«å
éšåæãããŒãžã£ãŒãã³ãŒã«ããã³ãŒã«ããã¯é¢æ°ãæå®ããŸãããã€ããªããå®è£
ãšã¯ç°ãªããReact Native ã©ã€ãã©ãªã¯ãæäœã®çµäºæã«ãã®é¢æ°ã 1 åã ãã³ãŒã«ããŸãã
Mobile SDK ã¯ã1 ã€ã®åŒæ°ãæåã³ãŒã«ããã¯ã«æž¡ããŸãããã®åŒæ°ã¯ãåæ ID ãå«ã次ã®åæã¡ã¿ããŒã¿ãè¿ããŸãã
syncIdâ ãã®åææäœã® IDtypeâsyncDowntargetâ æå®ããã¿ãŒã²ããoptionsâ (çç¥å¯èœ) ããŒãžã¢ãŒããšé ç®ãªã¹ãã®ãããããŸãã¯äž¡æ¹ãæå®ããé åsoupNameâ æå®ããã¹ãŒãåsyncNameâ æå®ããåæå (ããå Žå)
æåã³ãŒã«ããã¯ã«ãã®ä»ã®ã¢ã¯ã·ã§ã³ããªãã£ãå Žåã§ããã³ãŒã«ããã¯ãå®è£ ããåæ ID ãä¿åããŠããããšããå§ãããŸãããã®å€ã¯ãåŸã§å¿ èŠã«å¿ããŠååæå²ãåœãŠã®æäœã«äœ¿çšã§ããŸããæ¬¡ã«äžäœåæã®äŸã瀺ããŸãã
const syncDown =Â forceUtil.promiserNoRejection(mobilesync.syncDown);
...
const fieldlist = ["Id", "FirstName", "LastName",
"Title", "Email", "MobilePhone","Department",
"HomePhone", "LastModifiedDate"];
const target = {type:"soql",
query:`SELECT ${fieldlist.join(",")}
FROM Contact
LIMIT 10000`};
syncDown(false,
target,
"contacts",
{mergeMode:mobilesync.MERGE_MODE.OVERWRITE},
syncName,
(sync) => {/* Do something meaningful or omit this member */},
(error) => {/* Do something meaningful or omit this member */}
);äžäœåæ
Mobile Sync ãã©ã°ã€ã³ã® syncUp() 颿°ã¯ãäœæãæŽæ°ããŸãã¯å逿žã¿ã®ã¬ã³ãŒãã SmartStore ã¹ãŒããããSalesforce ãµãŒããŒã«ã³ããŒããŸãã
mobilesync.syncUp ([storeConfig,] target, soupName, options, [syncName,] successCb, errorCb);
äžäœåææäœãšåæ§ã«ãæåã³ãŒã«ããã¯é¢æ°ã®å ¥ååŒæ°ã«ã¯ãåæ ID ãå«ãåæã¡ã¿ããŒã¿ãå«ãŸããŸãã
次ã«ãäžäœåæã®äŸã瀺ããŸãã
const syncUp =Â forceUtil.promiserNoRejection(mobilesync.syncUp);
...
const fieldlist = ["FirstName", "LastName", "Title", "Email",
"MobilePhone","Department"];
syncUp(false,
{},
"contacts",
{mergeMode:mobilesync.MERGE_MODE.OVERWRITE, fieldlist},
(sync) => {/* Do something meaningful or omit this callback */},
(error) => {/* Do something meaningful or omit this callback */}
);ååæ
ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãšåæ§ã«ãreSync() ã¡ãœããã¯éåžžã«åªããæè»æ§ãšããã©ãŒãã³ã¹ãæäŸããã³ãŒãã£ã³ã°ãããããããŸããæå®ããåæåããããŸã§åæãããŠããªãå ŽåãreSync() ã¯å®å
šãªåæãå®è¡ããŸãããã§ã«åæãããããšãããå Žåã¯ãäœæãæŽæ°ããŸãã¯åé€ãããã¬ã³ãŒãã®ã¿ã®å¢ååæãå®è¡ãããŸãã
mobilesync.reSync ([storeConfig,] syncIdOrName, successCB, errorCB);
æäœã«ã€ããŠã次ã®ãããªèšå®ãæå®ããŸãã
syncIdOrNameâ ãã®åææäœã® ID ãŸãã¯usersyncs.jsonãã¡ã€ã«ã®åæåãsuccessCbãerrorCbâ æåãšãšã©ãŒã®ã³ãŒã«ããã¯é¢æ°
ãªãœãŒã¹
- ãã€ããªããããã³ React Native ã¢ããªã±ãŒã·ã§ã³ã§ã® Mobile Sync ã®äœ¿çš
- ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã§ã® Mobile Sync ã®äœ¿çš
- SmartStore ãµã³ãã«ã³ãŒãã«ã€ããŠã¯ããã³ãã¬ãŒãã¢ããªã±ãŒã·ã§ã³ãåç §ããŠãã ããã
- Android: MobileSyncExplorerKotlin
- iOS: MobileSyncExplorerSwift
- React Native: MobileSyncExplorerReactNative
- forcedroid ã䜿çšãã Android ãããžã§ã¯ãã®äœæ
- forceios ã䜿çšãã iOS ãããžã§ã¯ãã®äœæ
- forcereact ã䜿çšãã React Native ãããžã§ã¯ãã®äœæ
- ãã€ããªãããµã³ãã«ã¢ããªã±ãŒã·ã§ã³: SmartStoreExplorer
- React Native Web ãµã€ã
- ããªãŒãã±ãŒã¹äžäœåæã¿ãŒã²ããã®äœ¿çš
