Skip to main content
Bring your team and maximize your impact at Dreamforce. Register three or more to unlock $999 passes.

予想時間

トピック

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"

䞋䜍同期

Note

組織でモバむルナヌザヌ向けのブリヌフケヌスを䜿甚しおいる堎合、Mobile SDK 10.1 でブリヌフケヌス䞋䜍同期タヌゲットが導入されおいたす。

䞋䜍同期甚に蚭定されたブリヌフケヌスファむルの䟋を芋おみたしょう。

{
  "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 — すべおのロヌカルの倉曎ずロヌカルで倉曎されたレコヌドを保持したす。
Note

オプションパラメヌタヌを取らない syncDown(target:soupName:onUpdate:) メ゜ッドによっおキャッシュ内にある既存の sObject が䞊曞きされる可胜性がありたす。そのような堎合にロヌカルの倉曎を維持するには、䞋䜍同期する前に必ず䞊䜍同期を実行したす。

䞊䜍同期

䞊䜍同期では、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 プロゞェクトで実装するずどうなるかを芋おみたしょう。

最初に、この実装に䜿甚するアプリケヌションを䜜成したす。

  1. タヌミナルりィンドりで、forceios を䜿甚しおアプリケヌションを䜜成したす。
    • アプリケヌション皮別には native_swift を䜿甚したす。
    • アプリケヌションに offlineSwift ず名前を付けたす。
  1. forceios が完了したら、Xcode で新しいワヌクスペヌスを開きたす。

Xcode で、オフラむン機胜のセットアップず蚭定を確認したす。

  1. プロゞェクトナビゲヌタヌ (⌘1) で、[offlineSwift] > [offlineSwift] > [Supporting Files (サポヌトファむル)] を展開したす。ここに userstore.json ファむルず usersyncs.json ファむルがありたす。゚ディタヌでこれらのファむルを開くず、取匕先レコヌドのアクセスず定矩の基本蚭定が定矩されおいるこずがわかりたす。
  2. テンプレヌトによっお userstore.json ず usersyncs.json がプロゞェクトの [Build Phases (フェヌズの䜜成)] 蚭定のアプリケヌションバンドルに远加されたす。
    1. Xcode プロゞェクトナビゲヌタヌで、プロゞェクトノヌドを遞択したす。
    2. ゚ディタヌりィンドりで、[Build Phases (フェヌズの䜜成)] を遞択したす。
    3. [Copy Bundle Resources (バンドルリ゜ヌスのコピヌ)] を展開したす。userstore.json ず usersyncs.json が衚瀺されたす。぀たり、アプリケヌションの䜜成時にこれらがアプリケヌションバンドルに远加されたす。

では、コヌドを詳しく芋おみたしょう。

  1. プロゞェクトナビゲヌタヌで、[offlineSwift] > [offlineSwift] > [Classes (クラス)] > [SwiftUI] を展開したす。
  2. 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()
  3. プロゞェクトナビゲヌタヌで、[offlineSwift] > [offlineSwift] > [Classes (クラス)] > [Models (モデル)] を展開したす。
  4. AccountsListModel.swiftで、AccountsListModel クラスの 1 行目を芋おください。この行は、取匕先オブゞェクトの空のパブリッシュ枈み配列を定矩したす。アプリケヌションの SwiftUI オブゞェクトは、パブリッシュ枈み配列が倉曎されたずきに曎新を受信するように AccountsListModel にサブスクラむブしたす。
    /**
    ViewModel for Account List
    */
    class AccountsListModel: ObservableObject {
    @Published var accounts: [Account] = []
      ...
  5. fetchAccounts() 関数を芋぀けたす。
    func fetchAccounts(){
      syncTaskCancellable = syncManager?.publisher(for: "syncDownAccounts")
        .receive(on: RunLoop.main)
        .sink(receiveCompletion: { _ in }, receiveValue: { _ in
          self.loadFromSmartStore()
      })
      self.loadFromSmartStore()
    }
    ここで、Mobile Sync パブリッシャヌが usersyncs.json で定矩された名前付き同期操䜜 "syncDownAccounts" を取り、再同期したす。次にパブリッシャヌは返されたデヌタをデフォルトの SmartStore ストアにあるスヌプにコピヌしたす。fetchAccounts() がパブリッシャヌから応答を受信するず、loadFromSmartStore() をコヌルしお、SmartStore の曎新されたデヌタをパブリッシュ枈みの accounts 配列に非同期でコピヌしたす。応答の受信を埅っおいる間、fetchAccounts() は loadFromSmartStore() をコヌルしお、accounts 配列にロヌカルの倉曎が適甚されおいるこずを確認したす。では、loadFromSmartStore() がこの曎新をどう実行するかを芋おみたしょう。
    loadFromSmartStore() 関数は、SmartStore パブリッシャヌを䜿甚しお Smart SQL ク゚リを発行し、非同期応答を受信したす。応答が成功を瀺す堎合、関数は結果のデヌタセットをコヌル元にパブリッシュしたす。ここで、コヌル元が解析枈みの応答を AccountsListModel オブゞェクトの accounts 配列にコピヌしたす。 
  6. 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 — この同期操䜜の ID
  • type—syncDown
  • target — 指定したタヌゲット
  • soupName — 指定したスヌプ名
  • options — 指定したオプションの配列
  • status — 同期状況 (次のいずれか)
    1. NEW
    2. RUNNING
    3. DONE
    4. FAILED
  • 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 — 次のキヌずの察応付けを指定したす
    1. 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 — この同期操䜜の ID
  • type—syncDown
  • target — 指定したタヌゲット
  • 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 — 成功ず゚ラヌのコヌルバック関数

リ゜ヌス

Salesforce ヘルプで Trailhead のフィヌドバックを共有しおください。

Trailhead に぀いおの感想をお聞かせください。[Salesforce ヘルプ] サむトから新しいフィヌドバックフォヌムにい぀でもアクセスできるようになりたした。

詳现はこちら フィヌドバックの共有に進む