वेब सर्वर के साथ iPhone कोर डेटा को कैसे सिंक करें, और फिर अन्य उपकरणों पर धक्का दें? [बन्द है]


293

मैं कई उपकरणों जैसे कि iPad या Mac के बीच iPhone एप्लिकेशन में संग्रहीत कोर डेटा को सिंक करने के लिए एक विधि पर काम कर रहा हूं। IOS पर Core Data के साथ उपयोग के लिए कई (यदि कोई हो तो) सिंक फ्रेमवर्क नहीं हैं। हालाँकि, मैं निम्नलिखित अवधारणा के बारे में सोच रहा हूँ:

  1. एक परिवर्तन स्थानीय कोर डेटा स्टोर में किया जाता है, और परिवर्तन सहेज लिया जाता है। (ए) यदि डिवाइस ऑनलाइन है, तो यह सर्वर को परिवर्तन भेजने की कोशिश करता है, जिसमें डिवाइस का डिवाइस आईडी भी शामिल है जो कि बदलाव भेजा गया है। (b) यदि परिवर्तन सर्वर तक नहीं पहुंचता है, या यदि डिवाइस ऑनलाइन नहीं है, तो ऐप ऑनलाइन आने पर इसे बदलने के लिए एक कतार में परिवर्तन सेट कर देगा।
  2. क्लाउड में बैठा सर्वर विशिष्ट परिवर्तन सेट को अपने मास्टर डेटाबेस के साथ मिला देता है।
  3. एक परिवर्तन सेट (या परिवर्तन सेट की एक कतार) को क्लाउड सर्वर पर मर्ज किया जाता है, सर्वर उन सभी परिवर्तन सेटों को किसी न किसी तरह के पोलिंग सिस्टम का उपयोग करके सर्वर के साथ पंजीकृत अन्य उपकरणों पर धकेलता है। (मैंने Apple की पुश सेवाओं का उपयोग करने के लिए सोचा था, लेकिन जाहिरा तौर पर टिप्पणियों के अनुसार यह एक व्यावहारिक प्रणाली नहीं है।)

क्या कुछ कल्पना है जिसके बारे में मुझे सोचने की ज़रूरत है? मैंने ObjectiveResource , Core Resource और RestfulCoreData जैसे REST फ्रेमवर्क को देखा है । बेशक, ये सभी रूबी ऑन रेल्स के साथ काम कर रहे हैं, जिसे मैं बांध नहीं रहा हूं, लेकिन यह एक जगह है। मेरे समाधान के लिए मेरे पास मुख्य आवश्यकताएं हैं:

  1. मुख्य थ्रेड को रोके बिना पृष्ठभूमि में कोई भी परिवर्तन भेजा जाना चाहिए।
  2. इसे यथासंभव कम बैंडविड्थ का उपयोग करना चाहिए।

मैंने कई चुनौतियों के बारे में सोचा है:

  1. यह सुनिश्चित करना कि अलग-अलग डिवाइसों पर अलग-अलग डेटा स्टोर के लिए ऑब्जेक्ट आईडी सर्वर पर संलग्न हैं। यह कहना है, मेरे पास ऑब्जेक्ट आईडी और डिवाइस आईडी की एक तालिका होगी, जो डेटाबेस में संग्रहीत ऑब्जेक्ट के संदर्भ में बंधी है। मेरे पास एक रिकॉर्ड (डेटाबेसआईड [इस तालिका के लिए अद्वितीय], ऑब्जेक्टआईड [पूरे डेटाबेस में आइटम के लिए अद्वितीय], डेटाफ़ील्ड 1, डेटाफ़ील्ड 2), ऑब्जेक्टआईआईडी फ़ील्ड एक अन्य तालिका, AllObjects: (ObjectId, DeviceId, DeviceObjectId) का संदर्भ देगा। फिर, जब डिवाइस एक परिवर्तन सेट को धक्का देता है, तो यह डिवाइस आईडी और ऑब्जेक्ट के साथ स्थानीय डेटा स्टोर में कोर डेटा ऑब्जेक्ट से गुजर जाएगा। तब मेरा क्लाउड सर्वर ऑलऑब्जेक्ट टेबल में ऑब्जेक्टआईड और डिवाइस आईडी के खिलाफ जांच करेगा, और प्रारंभिक तालिका में बदलने के लिए रिकॉर्ड ढूंढेगा।
  2. सभी परिवर्तनों को टाइमस्टैम्प किया जाना चाहिए, ताकि उन्हें मर्ज किया जा सके।
  3. डिवाइस को बहुत अधिक बैटरी का उपयोग किए बिना, सर्वर को प्रदूषित करना होगा।
  4. स्थानीय उपकरणों को सर्वर से परिवर्तन प्राप्त होने पर / मेमोरी में रखी गई किसी भी चीज़ को अपडेट करने की आवश्यकता होगी।

क्या यहां कुछ और है जो मुझे याद आ रहा है? इसे संभव बनाने के लिए मुझे किस प्रकार की रूपरेखाएँ देखनी चाहिए?


5
आप प्राप्त किए जा रहे पुश सूचनाओं पर भरोसा नहीं कर सकते। उपयोगकर्ता बस उन्हें टैप कर सकता है और जब दूसरी सूचना आती है, तो ओएस पहले एक को फेंक देता है। IMO पुश सूचनाएं सिंक अपडेट को प्राप्त करने का एक बुरा तरीका है, वैसे भी, क्योंकि वे उपयोगकर्ता को बाधित करते हैं। जब भी लॉन्च किया जाता है तो ऐप को सिंक को आरंभ करना चाहिए।
ओले बेगमैन

ठीक। जानकारी के लिए धन्यवाद - सर्वर को लगातार मतदान करने और लॉन्च पर अपडेट की जांच करने के लिए, क्या डिवाइस को अपडेट प्राप्त करने का कोई तरीका है? अगर ऐप एक साथ कई डिवाइस पर खुला है तो मैं इसे काम करने में दिलचस्पी रखता हूं।
जेसन

1
(मुझे पता है कि थोड़ी देर हो गई है, लेकिन किसी को भी इस बारे में पता चलता है और यह भी आश्चर्य होता है) एक साथ कई उपकरणों को एक साथ रखने के लिए या तो आप दूसरे डिवाइस या सर्वर के साथ एक खुला संबंध रख सकते हैं, और दूसरे डिवाइस को बताने के लिए संदेश भेज सकते हैं (s) ) जब कोई अपडेट होता है। (जैसे IRC / इंस्टेंट मैसेजिंग काम करता है)
Dan2552

1
@ Dan2552: आप जो वर्णन करते हैं, उसे [लंबे मतदान] [ en.wikipedia.org/wiki/… के रूप में जाना जाता है और यह एक महान विचार है, हालांकि खुले कनेक्शन मोबाइल डिवाइस पर बहुत अधिक बैटरी और बैंडविड्थ की खपत करते हैं।
जॉन्डोडो

1
अपने ऐप और वेब सेवा के बीच डेटा सिंक करने के तरीके के बारे में राय वेंडरलिच का एक अच्छा ट्यूटोरियल यहां है: रेवेंडरलिच.com
JRG-Developer

जवाबों:


144

मैं सुझाव देता हूं कि दान ग्रोवर द्वारा iPhone 2009 सम्मेलन में चर्चा की गई सिंक रणनीति को ध्यान से पढ़ना और उस पर अमल करना, यहाँ पीडीएफ दस्तावेज़ के रूप में उपलब्ध है

यह एक व्यवहार्य समाधान है और इसे लागू करना मुश्किल नहीं है (दान ने अपने कई अनुप्रयोगों में इसे लागू किया), क्रिस द्वारा वर्णित समाधान को ओवरलैप करते हुए। सिंकिंग की गहन, सैद्धांतिक चर्चा के लिए, रस कॉक्स (MIT) और विलियम जोसेफसन (प्रिंसटन) से पेपर देखें:

वेक्टर टाइम पेयर के साथ फाइल सिंक्रोनाइज़ेशन

जो कुछ स्पष्ट संशोधनों के साथ कोर डेटा पर समान रूप से लागू होता है। यह समग्र रूप से अधिक मजबूत और विश्वसनीय सिंक रणनीति प्रदान करता है, लेकिन इसे सही ढंग से लागू करने के लिए अधिक प्रयास की आवश्यकता होती है।

संपादित करें:

ऐसा लगता है कि ग्रोवर की पीडीएफ फाइल अब उपलब्ध नहीं है (टूटी लिंक, मार्च 2015)। अद्यतन: लिंक यहाँ पर वापस मशीन के माध्यम से उपलब्ध है

ZSync नामक ऑब्जेक्टिव-सी फ्रेमवर्क और मार्कस ज़रा द्वारा विकसित किया गया है, यह देखते हुए कि iCloud अंत में सही कोर डेटा सिंक्रोनाइज़ेशन का समर्थन करता है।


किसी के पास ZSync वीडियो के लिए एक अद्यतन लिंक है? इसके अलावा, ZSync अभी भी बनाए रखा है? मैं देख रहा हूं कि इसे आखिरी बार 2010 में अपडेट किया गया था।
जेरी वेल्डिन

ZSync की गितुब पर आखिरी बार सितंबर 2010 में हुई थी जो मुझे विश्वास दिलाता है कि मार्कस ने इसका समर्थन करना बंद कर दिया है।
पेरिशेबल डेव

1
डान ग्रोवर द्वारा वर्णित एल्गोरिथ्म काफी अच्छा है। हालाँकि, यह एक बहु-थ्रेडेड सर्वर कोड के साथ काम नहीं करेगा (इस प्रकार: यह बिल्कुल पैमाने पर नहीं होगा) क्योंकि यह सुनिश्चित करने का कोई तरीका नहीं है कि ग्राहक को एक अपडेट याद नहीं होगा जब नए अपडेट की जांच के लिए समय का उपयोग किया जाता है। । कृपया, मुझे सही करें अगर मैं गलत हूँ - मैं इस के एक कार्यशील कार्यान्वयन को देखने के लिए मार डालूंगा।
मासी

1
@Patt, मैंने आपको अनुरोध के अनुसार बस पीडीएफ फाइल भेजी है। चीयर्स, मासिमो काफ़ारो।
मासिमो कापरो

3
दान ग्रोवर द्वारा लापता क्रॉस-प्लेटफ़ॉर्म डेटा सिंक्रोनाइज़ेशन पीडीएफ स्लाइड्स वेबैक मशीन के माध्यम से सुलभ हैं।
मैथ्यू Kairys

272

मैंने कुछ ऐसा ही किया है जो आप करने की कोशिश कर रहे हैं। मुझे बताएं कि मैंने क्या सीखा है और मैंने इसे कैसे किया है।

मुझे लगता है कि आपके सर्वर पर आपके कोर डेटा ऑब्जेक्ट और मॉडल (या डीबी स्कीमा) के बीच एक-से-एक संबंध है। आप बस सर्वर की सामग्री को ग्राहकों के साथ रखना चाहते हैं, लेकिन ग्राहक डेटा को संशोधित और जोड़ भी सकते हैं। अगर मुझे वह अधिकार मिल गया, तो पढ़ते रहिए।

मैंने सिंक्रनाइज़ेशन में सहायता के लिए चार फ़ील्ड जोड़े:

  1. सिंक_स्टैटस - इस फ़ील्ड को केवल अपने मुख्य डेटा मॉडल में जोड़ें। यह ऐप द्वारा यह निर्धारित करने के लिए उपयोग किया जाता है कि आपके पास आइटम पर लंबित परिवर्तन है या नहीं। मैं निम्नलिखित कोड का उपयोग करता हूं: 0 का अर्थ है कोई परिवर्तन नहीं, 1 का अर्थ है कि यह सर्वर से सिंक्रनाइज़ होने के लिए कतारबद्ध है, और 2 का अर्थ है कि यह एक अस्थायी वस्तु है और इसे शुद्ध किया जा सकता है।
  2. is_deleted - इसे सर्वर और कोर डेटा मॉडल में जोड़ें। हटाएं घटना वास्तव में डेटाबेस या आपके क्लाइंट मॉडल से एक पंक्ति को नहीं हटाना चाहिए क्योंकि यह आपको वापस सिंक्रनाइज़ करने के लिए कुछ भी नहीं छोड़ता है। यह साधारण बूलियन ध्वज होने से, आप is_deleted को 1 पर सेट कर सकते हैं, इसे सिंक्रनाइज़ कर सकते हैं, और हर कोई खुश होगा। आपको गैर-हटाए गए आइटम को "is_deleted = 0" के साथ क्वेरी करने के लिए सर्वर और क्लाइंट पर कोड को भी संशोधित करना होगा।
  3. last_modified - इसे सर्वर और कोर डेटा मॉडल में जोड़ें। जब भी उस रिकॉर्ड में कुछ भी परिवर्तन होता है, तो इस फ़ील्ड को सर्वर द्वारा वर्तमान तिथि और समय के साथ स्वचालित रूप से अपडेट किया जाना चाहिए। इसे ग्राहक द्वारा कभी संशोधित नहीं किया जाना चाहिए।
  4. गाइड - सर्वर और कोर डेटा मॉडल के लिए विश्व स्तर पर अद्वितीय आईडी ( http://en.wikipedia.org/wiki/Glo Worldwide_unique_identifier ) फ़ील्ड जोड़ें । यह फ़ील्ड प्राथमिक कुंजी बन जाती है और क्लाइंट पर नए रिकॉर्ड बनाते समय महत्वपूर्ण हो जाती है। आम तौर पर आपकी प्राथमिक कुंजी सर्वर पर एक वृद्धिशील पूर्णांक होती है, लेकिन हमें यह ध्यान रखना होगा कि सामग्री ऑफ़लाइन बनाई जा सकती है और बाद में सिंक्रनाइज़ की जा सकती है। GUID हमें ऑफ़लाइन होने के दौरान एक कुंजी बनाने की अनुमति देता है।

जब भी कुछ बदलता है और सर्वर से सिंक्रनाइज़ करने की आवश्यकता होती है, तो क्लाइंट पर, अपने मॉडल ऑब्जेक्ट पर सिंक_स्टैटस 1 पर सेट करने के लिए कोड जोड़ें। नए मॉडल ऑब्जेक्ट को GUID उत्पन्न करना चाहिए।

सिंक्रोनाइज़ेशन एक एकल अनुरोध है। अनुरोध में शामिल हैं:

  • आपके मॉडल ऑब्जेक्ट्स का MAX last_modified टाइम स्टैम्प। यह उस सर्वर को बताता है जिसे आप केवल इस समय स्टाम्प के बाद परिवर्तन चाहते हैं।
  • एक JSON सरणी जिसमें सिंक_स्टैटस = 1 के साथ सभी आइटम हैं।

सर्वर को अनुरोध मिलता है और यह करता है:

  • यह JSON सरणी से सामग्री लेता है और इसमें शामिल रिकॉर्ड को संशोधित या संशोधित करता है। Last_modified फ़ील्ड स्वचालित रूप से अपडेट की जाती है।
  • सर्वर एक JSON सरणी देता है जिसमें अनुरोध में भेजे गए समय स्टैम्प की तुलना में अंतिम_modified समय स्टैम्प के साथ सभी ऑब्जेक्ट होते हैं। इसमें केवल प्राप्त की गई वस्तुएं शामिल होंगी, जो एक पावती के रूप में कार्य करती है कि रिकॉर्ड सफलतापूर्वक सर्वर से सिंक्रनाइज़ किया गया था।

एप्लिकेशन को प्रतिक्रिया मिलती है और यह करता है:

  • यह JSON सरणी से सामग्री लेता है और इसमें शामिल रिकॉर्ड को संशोधित या संशोधित करता है। प्रत्येक रिकॉर्ड में 0 का सिंक_स्टैटस मिलता है।

मुझे आशा है कि वह मदद करेंगे। मैंने शब्द रिकॉर्ड और मॉडल का परस्पर उपयोग किया है, लेकिन मुझे लगता है कि आपको विचार मिलता है। सौभाग्य।


2
Last_modified फ़ील्ड स्थानीय डेटाबेस में भी मौजूद है, लेकिन यह iPhone घड़ी द्वारा अपडेट नहीं किया गया है। यह सर्वर द्वारा सेट किया गया है, और वापस सिंक्रनाइज़ किया गया है। MAX (last_modified) तिथि वह है जो ऐप सर्वर को भेजता है, यह बताने के लिए कि उस तिथि के बाद संशोधित सब कुछ वापस भेजने के लिए।
क्रिस

3
ग्राहक पर एक वैश्विक मूल्य प्रतिस्थापित कर सकता है MAX(last_modified), लेकिन यह MAX(last_modified)पर्याप्त होगा क्योंकि यह पर्याप्त होगा। sync_statusएक और भूमिका है। जैसा कि मैंने पहले लिखा था, MAX(last_modified)यह निर्धारित करता है कि सर्वर से सिंक्रोनाइज़ होने की sync_statusक्या ज़रूरत है , जबकि यह निर्धारित करता है कि सर्वर के साथ सिंक करने की क्या ज़रूरत है।
क्रिस

2
@Flex_Addicted धन्यवाद। हां, आपको प्रत्येक इकाई के लिए फ़ील्ड को दोहराने की आवश्यकता होगी जिसे आप सिंक्रनाइज़ करना चाहते हैं। हालांकि, आपको किसी रिश्ते के साथ मॉडल को सिंक्रनाइज़ करते समय अधिक से अधिक ध्यान रखने की आवश्यकता है (जैसे, 1-से-कई)।
क्रिस

2
@BenPackard - आप सही हैं। दृष्टिकोण किसी भी संघर्ष समाधान नहीं करता है, तो पिछले ग्राहक जीत जाएगा। मुझे अपने ऐप्स में इससे निपटने की ज़रूरत नहीं थी क्योंकि किसी एकल उपयोगकर्ता द्वारा रिकॉर्ड संपादित किए जाते हैं। मुझे यह जानने की उत्सुकता होगी कि आप इसे कैसे हल करते हैं।
क्रिस

2
हाय @noilly, निम्नलिखित मामले पर विचार करें: आप किसी स्थानीय ऑब्जेक्ट में परिवर्तन करते हैं और इसे सर्वर पर वापस सिंक्रनाइज़ करने की आवश्यकता होती है। सिंक केवल घंटे या दिनों के बाद हो सकता है (यदि आप थोड़ी देर के लिए ऑफ़लाइन हैं, तो कहें), और उस समय में ऐप बंद हो सकता है और कुछ बार पुनरारंभ हो सकता है। इस मामले में NSManagedObjectContext पर तरीके ज्यादा मदद नहीं करेंगे।
क्रिस

11

यदि आप अभी भी जाने के लिए रास्ता ढूंढ रहे हैं, तो काउचबेस मोबाइल में देखें। यह मूल रूप से आप सभी चाहते हैं। ( http://www.couchbase.com/nosql-dat डेटाबेस/couchbase-mobile )


3
यह केवल वही करता है जो आप चाहते हैं यदि आप अपने डेटा को संबंधपरक डेटा के बजाय दस्तावेज़ के रूप में व्यक्त कर सकते हैं। चारों ओर काम कर रहे हैं, लेकिन वे हमेशा सुंदर या इसके लायक नहीं हैं।
जेरेमी वेल्डिन

दस्तावेज़ छोटे अनुप्रयोगों के लिए पर्याप्त हैं
हाई फेंग काओ

@radiospiel आपका लिंक टूट गया है
मिक

यह एक निर्भरता भी जोड़ देगा कि बैकएंड को काउचबेस डीबी में लिखने की आवश्यकता है। यहां तक ​​कि मैंने सिंकिंग के लिए एनओएसक्यूएल के विचार के साथ शुरुआत की, लेकिन मैं अपने बैकएंड को एनओएसक्यूएल होने के लिए प्रतिबंधित नहीं कर सकता क्योंकि हमारे पास बैक में चलने वाला एमएस एसक्यूएल है।
थिसुमर्सगिन

@ मिक्स: यह फिर से काम करने लगता है (या किसी ने लिंक को ठीक किया है! धन्यवाद)
रेडिओस्पेल

7

जैसे @Cris मैंने क्लाइंट और सर्वर के बीच सिंक्रनाइज़ेशन के लिए क्लास लागू किया है और अब तक ज्ञात सभी समस्याओं को हल किया है (सर्वर से डेटा भेजें / प्राप्त करें, टाइमस्टैम्प के आधार पर मर्ज करें, अविश्वसनीय नेटवर्क स्थितियों में डुप्लिकेट प्रविष्टियों को हटा दिया है, nas डेटा सिंक्रनाइज़ करें और फ़ाइलें आदि ..)

आप सिर्फ क्लास को बताएं कि कौन सी इकाई और कौन सा कॉलम सिंक करना चाहिए और आपका सर्वर कहां है।

M3Synchronization * syncEntity = [[M3Synchronization alloc] initForClass: @"Car"
                                                              andContext: context
                                                            andServerUrl: kWebsiteUrl
                                             andServerReceiverScriptName: kServerReceiverScript
                                              andServerFetcherScriptName: kServerFetcherScript
                                                    ansSyncedTableFields:@[@"licenceNumber", @"manufacturer", @"model"]
                                                    andUniqueTableFields:@[@"licenceNumber"]];


syncEntity.delegate = self; // delegate should implement onComplete and onError methods
syncEntity.additionalPostParamsDictionary = ... // add some POST params to authenticate current user

[syncEntity sync];

आप स्रोत, काम करने के उदाहरण और अधिक निर्देश यहां पा सकते हैं: github.com/knagode/M3Synchronization


क्या यह ठीक होगा अगर हम डिवाइस के समय को असामान्य मान में बदल दें?
गोल्डन

5

उपयोगकर्ता को पुश सूचना के माध्यम से डेटा अपडेट करने के लिए नोटिस करें। क्लाउड सर्वर पर स्थानीय डेटा और डेटा की जांच करने के लिए ऐप में एक पृष्ठभूमि थ्रेड का उपयोग करें, जबकि सर्वर पर परिवर्तन होता है, स्थानीय डेटा को बदलें, इसके विपरीत।

इसलिए मुझे लगता है कि सबसे मुश्किल हिस्सा डेटा का अनुमान लगाना है, जिसमें पक्ष अमान्य है।

आशा है कि यह आपको मदद कर सकता है


5

मैंने अभी अपने नए कोर डेटा क्लाउड सिंकिंग एपीआई के पहले संस्करण को पोस्ट किया है, जिसे SynCloud के नाम से जाना जाता है। SynCloud में iCloud के साथ बहुत सारे अंतर हैं क्योंकि यह मल्टी-उपयोगकर्ता सिंक इंटरफ़ेस के लिए अनुमति देता है। यह अन्य सिंकिंग एपी से भी अलग है क्योंकि यह मल्टी-टेबल, रिलेशनल डेटा के लिए अनुमति देता है।

कृपया http://www.syncloudapi.com पर अधिक जानकारी प्राप्त करें

IOS 6 SDK के साथ निर्माण करें, यह 9/27/2012 तक अद्यतित है।


5
ढेर अतिप्रवाह में आपका स्वागत है! अपना उत्तर पोस्ट करने के लिए धन्यवाद! कृपया सेल्फ-प्रमोशन पर अक्सर पूछे जाने वाले प्रश्नों को ध्यान से पढ़ें ।
एंड्रयू बार्बर

5

मुझे लगता है कि GUID समस्या का एक अच्छा समाधान "वितरित आईडी सिस्टम" है। मुझे यकीन नहीं है कि सही शब्द क्या है, लेकिन मुझे लगता है कि एमएस एसक्यूएल सर्वर डॉक्स ने इसे कॉल करने के लिए उपयोग किया है (वितरित / सिंक'ड डेटाबेस के लिए एसक्यूएल इस पद्धति का उपयोग / उपयोग करता है)। यह बहुत आसान है:

सर्वर सभी आईडी असाइन करता है। हर बार एक सिंक किया जाता है, पहली चीज़ जो चेक की जाती है, "इस क्लाइंट पर मेरे पास कितनी आईडी हैं?" यदि क्लाइंट कम चल रहा है, तो यह आईडी के नए ब्लॉक के लिए सर्वर से पूछता है। क्लाइंट तब नए रिकॉर्ड के लिए उस सीमा में आईडी का उपयोग करता है। यह अधिकांश आवश्यकताओं के लिए बहुत अच्छा काम करता है, यदि आप एक ब्लॉक को पर्याप्त रूप से असाइन कर सकते हैं कि यह अगले सिंक से पहले "कभी नहीं" चलना चाहिए, लेकिन इतना बड़ा नहीं कि सर्वर समय के साथ बाहर चला जाए। यदि क्लाइंट कभी भी बाहर चला जाता है, तो हैंडलिंग बहुत सरल हो सकती है, बस उपयोगकर्ता को "खेद है कि आप सिंक होने तक अधिक आइटम नहीं जोड़ सकते हैं" ... यदि वे कई आइटम जोड़ रहे हैं, तो क्या उन्हें बासी डेटा से बचने के लिए सिंक नहीं करना चाहिए वैसे भी मुद्दे?

मुझे लगता है कि यह यादृच्छिक GUID का उपयोग करने के लिए बेहतर है क्योंकि यादृच्छिक GUID 100% सुरक्षित नहीं हैं, और आमतौर पर मानक ID (128-बिट बनाम 32-बिट) की तुलना में अधिक लंबे समय तक रहने की आवश्यकता होती है। आपके पास आमतौर पर आईडी द्वारा अनुक्रमित होते हैं और अक्सर आईडी संख्याओं को स्मृति में रखते हैं, इसलिए उन्हें छोटा रखना महत्वपूर्ण है।

वास्तव में उत्तर के रूप में पोस्ट नहीं करना चाहता था, लेकिन मुझे नहीं पता कि कोई भी एक टिप्पणी के रूप में देखेगा, और मुझे लगता है कि यह इस विषय के लिए महत्वपूर्ण है और अन्य उत्तरों में शामिल नहीं है।


2

पहले आपको यह पता लगाना चाहिए कि आपके पास कितने डेटा, टेबल और संबंध होंगे। अपने समाधान में मैंने ड्रॉपबॉक्स फ़ाइलों के माध्यम से सिंकिंग लागू की है। मैं मुख्य MOC में परिवर्तनों का निरीक्षण करता हूं और इन डेटा को फ़ाइलों में सहेजता हूं (प्रत्येक पंक्ति को gzipped json के रूप में सहेजा गया है)। यदि कोई इंटरनेट कनेक्शन काम कर रहा है, तो मैं जांचता हूं कि क्या ड्रॉपबॉक्स पर कोई बदलाव हैं (ड्रॉपबॉक्स मुझे डेल्टा परिवर्तन देता है), उन्हें डाउनलोड करें और मर्ज करें (नवीनतम जीत), और अंत में परिवर्तित फाइलें डाल दें। सिंक से पहले मैंने अधूरे डेटा को सिंक करने वाले अन्य ग्राहकों को रोकने के लिए ड्रॉपबॉक्स पर लॉक फ़ाइल डाल दी। परिवर्तन डाउनलोड करते समय यह सुरक्षित है कि केवल आंशिक डेटा डाउनलोड किया जाता है (उदाहरण के लिए इंटरनेट कनेक्शन खो गया)। जब डाउनलोडिंग समाप्त हो जाती है (पूरी तरह से या आंशिक) तो यह कोर डेटा में फाइलों को लोड करना शुरू कर देता है। जब अनसुलझे संबंध होते हैं (सभी फाइलें डाउनलोड नहीं होती हैं) तो यह फाइलों को लोड करना बंद कर देता है और बाद में डाउनलोड करने की कोशिश करता है। संबंध केवल GUID के रूप में संग्रहीत किए जाते हैं, इसलिए मैं आसानी से जांच कर सकता हूं कि पूर्ण डेटा अखंडता के लिए कौन सी फ़ाइलों को लोड करना है। कोर डेटा में बदलाव के बाद सिंकिंग शुरू हो रही है। यदि कोई परिवर्तन नहीं हैं, तो यह ड्रॉपबॉक्स पर हर कुछ मिनटों में और ऐप स्टार्टअप पर परिवर्तनों की जांच करता है। अतिरिक्त जब परिवर्तन सर्वर पर भेजे जाते हैं तो मैं अन्य उपकरणों को प्रसारण भेजकर उन्हें परिवर्तनों के बारे में सूचित करता हूं, ताकि वे तेजी से सिंक कर सकें। प्रत्येक सिंक की गई इकाई में GUID संपत्ति होती है (गाइड का उपयोग एक्सचेंज फाइल के लिए फाइलनाम के रूप में भी किया जाता है)। मेरे पास सिंक डेटाबेस भी है जहां मैं प्रत्येक फ़ाइल के ड्रॉपबॉक्स संशोधन को संग्रहीत करता हूं (मैं इसकी तुलना तब कर सकता हूं जब ड्रॉपबॉक्स डेल्टा रीसेट करता है यह राज्य है)। फ़ाइलों में इकाई का नाम, राज्य (हटाए गए / हटाए गए), गाइड (फ़ाइल नाम के समान), डेटाबेस संशोधन (डेटा माइग्रेशन का पता लगाने या कभी ऐप संस्करणों के साथ समन्वय से बचने के लिए) और निश्चित रूप से डेटा (यदि पंक्ति नहीं हटाई गई है) शामिल हैं। इसलिए मैं आसानी से पूर्ण डेटा अखंडता के लिए लोड करने के लिए कौन सी फ़ाइलों की जांच कर सकता हूं। कोर डेटा में बदलाव के बाद सिंकिंग शुरू हो रही है। यदि कोई परिवर्तन नहीं हैं, तो यह ड्रॉपबॉक्स पर हर कुछ मिनटों में और ऐप स्टार्टअप पर परिवर्तनों की जांच करता है। अतिरिक्त जब परिवर्तन सर्वर पर भेजे जाते हैं तो मैं अन्य उपकरणों को प्रसारण भेजकर उन्हें परिवर्तनों के बारे में सूचित करता हूं, ताकि वे तेजी से सिंक कर सकें। प्रत्येक सिंक की गई इकाई में GUID संपत्ति होती है (गाइड का उपयोग एक्सचेंज फाइल के लिए फाइलनाम के रूप में भी किया जाता है)। मेरे पास सिंक डेटाबेस भी है जहां मैं प्रत्येक फ़ाइल के ड्रॉपबॉक्स संशोधन को संग्रहीत करता हूं (मैं इसकी तुलना तब कर सकता हूं जब ड्रॉपबॉक्स डेल्टा रीसेट करता है यह राज्य है)। फ़ाइलों में इकाई का नाम, राज्य (हटाए गए / हटाए गए), गाइड (फ़ाइल नाम के समान), डेटाबेस संशोधन (डेटा माइग्रेशन का पता लगाने या कभी ऐप संस्करणों के साथ समन्वय से बचने के लिए) और निश्चित रूप से डेटा (यदि पंक्ति नहीं हटाई गई है) शामिल हैं। इसलिए मैं आसानी से पूर्ण डेटा अखंडता के लिए लोड करने के लिए कौन सी फ़ाइलों की जांच कर सकता हूं। कोर डेटा में बदलाव के बाद सिंकिंग शुरू हो रही है। यदि कोई परिवर्तन नहीं हैं, तो यह ड्रॉपबॉक्स पर हर कुछ मिनटों में और ऐप स्टार्टअप पर परिवर्तनों की जांच करता है। अतिरिक्त जब परिवर्तन सर्वर पर भेजे जाते हैं तो मैं अन्य उपकरणों को प्रसारण भेजकर उन्हें परिवर्तनों के बारे में सूचित करता हूं, ताकि वे तेजी से सिंक कर सकें। प्रत्येक सिंक की गई इकाई में GUID संपत्ति होती है (गाइड का उपयोग एक्सचेंज फाइल के लिए फाइलनाम के रूप में भी किया जाता है)। मेरे पास सिंक डेटाबेस भी है जहां मैं प्रत्येक फ़ाइल के ड्रॉपबॉक्स संशोधन को संग्रहीत करता हूं (मैं इसकी तुलना तब कर सकता हूं जब ड्रॉपबॉक्स डेल्टा रीसेट करता है यह राज्य है)। फ़ाइलों में इकाई का नाम, राज्य (हटाए गए / हटाए गए), गाइड (फ़ाइल नाम के समान), डेटाबेस संशोधन (डेटा माइग्रेशन का पता लगाने या कभी ऐप संस्करणों के साथ समन्वय से बचने के लिए) और निश्चित रूप से डेटा (यदि पंक्ति नहीं हटाई गई है) शामिल हैं।

यह समाधान हजारों फ़ाइलों और लगभग 30 संस्थाओं के लिए काम कर रहा है। ड्रॉपबॉक्स के बजाय मैं कुंजी / मान स्टोर का उपयोग REST वेब सेवा के रूप में कर सकता हूं जिसे मैं बाद में करना चाहता हूं, लेकिन इसके लिए कोई समय नहीं है :) अभी के लिए, मेरी राय में, मेरा समाधान iCloud की तुलना में अधिक विश्वसनीय है और, जो बहुत महत्वपूर्ण है, मेरा पूरा नियंत्रण है कि यह कैसे काम कर रहा है (मुख्यतः क्योंकि यह मेरा अपना कोड है)।

एमओसी परिवर्तनों को लेनदेन के रूप में सहेजने के लिए एक और उपाय है - सर्वर के साथ आदान-प्रदान करने वाली बहुत कम फाइलें होंगी, लेकिन खाली कोर डेटा में उचित क्रम में प्रारंभिक लोड करना कठिन है। iCloud इस तरह से काम कर रहा है, और अन्य सिंकिंग समाधानों में भी समान दृष्टिकोण है, जैसे TICoreDataSync

-- अपडेट करें

थोड़ी देर के बाद, मैं एनसेम्बल में चला गया - मैं इस समाधान को पहिया को मजबूत करने की सलाह देता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.