Android ऐप और वेबसर्वर के बीच सिंक डेटा [बंद]


262

मैं Android ऐप और सर्वर के बीच डेटा (जैसे db रिकॉर्ड, मीडिया) को सिंक करना चाहता हूं। यदि आपने देखा Evernoteया इसी तरह के अनुप्रयोग हैं, तो आप निश्चित रूप से मेरा मतलब समझते हैं।

मेरे पास कुछ प्रश्न हैं (कल्पना करें कि हम DB रिकॉर्ड्स को सिंक करना चाहते हैं):

  1. प्रत्येक उपयोगकर्ता के पास खुद के लिए सर्वर स्पेस का एक हिस्सा होता है (जैसे Evernoteया Dropbox)। शायद उपयोगकर्ता सेलफोन द्वारा नए रिकॉर्ड बनाता है और सर्वर में नए रिकॉर्ड बनाता है। मैं इन रिकॉर्ड को एक साथ कैसे मिला सकता हूं? यदि एक ही आईडी के साथ रिकॉर्ड हैं तो आप मुझे क्या सुझाव देते हैं?

  2. JSON को छोड़कर , क्या सेलफोन डिवाइस और सर्वर के बीच डेटा भेजने का कोई तरीका है?

  3. यदि SyncAdapter और ContentProvider मेरी समस्याओं को हल कर सकते हैं, तो कृपया मेरे लिए बिल्कुल स्पष्ट करें। (यदि आप कुछ नमूने या ट्यूटोरियल मुझे दे सकते हैं या मेरी खोज को व्यापक बनाने / मार्गदर्शन करने में मदद करने के लिए कोई सलाह या कीवर्ड देंगे)


1
पहले आपको सर्वर के साथ अपने संचार प्रोटोकॉल का पता लगाने (निर्णय लेने) की आवश्यकता है - इसलिए - आप किस डेटा को स्थानांतरित कर सकते हैं और कैसे।
होवेनेसियन

यह मेरे लिए महत्वपूर्ण है, SQLlite डेटा स्थानांतरित करें। लेकिन मुझे पता होगा कि दूसरे डेटा को कैसे ट्रांसफर किया जाता है। मैं प्रोटोकॉल के बारे में आपका मतलब नहीं समझता। कृपया और समझाएं।
ओमिद नाज़िफ़ी

प्रोटोकॉल से मेरा मतलब है कि यह simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan

1
konysync कोशिश, konylabs का एक उत्पाद है जो विभिन्न प्लेटफार्मों (एंड्रॉयड, खिड़कियां, ios), वेबसर्वर, डेटा प्रदाताओं (Salesforce, पौधों का रस प्रदाता), डेटाबेस (sqlserver, mysql ...) भर में एंड-टू-एंड समाधान प्रदान करता है
saimadan

जवाबों:


311

मैं बड़े प्रश्न को संबोधित करके आपके सभी सवालों का जवाब देने की कोशिश करूंगा: मैं वेबसर्वर और एंड्रॉइड ऐप के बीच डेटा कैसे सिंक कर सकता हूं?


अपने वेबसर्वर और एंड्रॉइड ऐप के बीच डेटा को सिंक करना आपके एंड्रॉइड डिवाइस पर विभिन्न घटकों के एक जोड़े की आवश्यकता होती है।

लगातार भंडारण:

यह आपके फोन वास्तव में वेबसर्वर से प्राप्त डेटा को संग्रहीत करता है। इसे पूरा करने के लिए एक संभव तरीका एक Sqlite डेटाबेस द्वारा समर्थित अपना स्वयं का कस्टम ContentProvider लिख रहा है। सामग्री प्रदाता के लिए एक अच्छा ट्यूटोरियल यहां पाया जा सकता है: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

एक ContentProvider आपके संग्रहीत डेटा के साथ बातचीत करने के लिए एक सुसंगत इंटरफ़ेस को परिभाषित करता है। यदि आप चाहते हैं तो यह आपके डेटा के साथ अन्य अनुप्रयोगों को भी बातचीत करने की अनुमति दे सकता है। अपने ContentProvider के पीछे Sqlite डेटाबेस, Cache, या कोई भी मनमाना स्टोरेज मैकेनिज़्म हो सकता है।

जबकि मैं निश्चित रूप से एक ContentProvider का उपयोग करने की सलाह दूंगा एक SQLite डेटाबेस के साथ आप आप चाहते थे किसी भी जावा आधारित भंडारण का उपयोग कर सकते।

डेटा इंटरचेंज प्रारूप:

यह वह प्रारूप है जिसका उपयोग आप अपने वेबसर्वर और अपने एंड्रॉइड ऐप के बीच डेटा भेजने के लिए करते हैं। इन दिनों दो सबसे लोकप्रिय प्रारूप XML और JSON हैं। अपना प्रारूप चुनते समय, आपको यह सोचना चाहिए कि किस प्रकार के क्रमांकन पुस्तकालय उपलब्ध हैं। मैं जानता हूं कि जसोन सीरियलाइजेशन के लिए एक शानदार लाइब्रेरी है, जिसे गॉन कहा जाता है: https://github.com/google/gson , हालांकि मुझे यकीन है कि XML के लिए भी इसी तरह की लाइब्रेरी मौजूद हैं।

सिंक्रनाइज़ेशन सेवा

आप कुछ प्रकार के अतुल्यकालिक कार्य चाहते हैं जो आपके सर्वर से नया डेटा प्राप्त कर सकते हैं और सर्वर की सामग्री को प्रतिबिंबित करने के लिए मोबाइल सामग्री को ताज़ा कर सकते हैं। जब भी आप सामग्री में स्थानीय परिवर्तन करते हैं और उन परिवर्तनों को प्रतिबिंबित करना चाहते हैं, तो आप सर्वर को सूचित करना चाहते हैं। Android इस पैटर्न को आसानी से हल करने के तरीके के रूप में SyncAdapter पैटर्न प्रदान करता है । आपको उपयोगकर्ता खातों को पंजीकृत करने की आवश्यकता होगी, और फिर एंड्रॉइड आपके लिए बहुत सारे जादू का प्रदर्शन करेगा, और आपको स्वचालित रूप से सिंक करने की अनुमति देगा। यहाँ एक अच्छा ट्यूटोरियल है: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


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


3
बड़ी मात्रा में डेटा के बारे में क्या? मैं कैसे सिंक कर सकता हूं?
प्रतीक बुटानी

4
बहुत अच्छी तरह से समझाया कि मेरे पास बस एक नोट है ... SyncAdapter -> "बहुत सारे जादू करें"। मुझे आशा है कि आप इसे काले जादू के रूप में संदर्भित कर रहे हैं ... यह पूरी तरह से बुराई है।
MRodrigues

@ मैड्रिग्स: सिंक एडॉप्टर डेवलपर के लिए काला जादू हो सकता है लेकिन यह अभी भी स्थिरता और कार्यक्षमता के लिए जादू करता है, यह अन्य
कामों की

2
खुद webservice को एंड्रॉइड डिवाइस के साथ सिंक करने की क्या आवश्यकता है? क्या यह वसंत के साथ संभव है?
जुबलीकॉन

58

अगर हम आज के बारे में सोचते हैं , तो स्वीकृत उत्तर बहुत पुराना है। जैसा कि हम जानते हैं कि हमारे पास कई नए पुस्तकालय हैं जो इस प्रकार के एप्लिकेशन को बनाने में आपकी मदद कर सकते हैं।

आपको निम्नलिखित विषयों को सीखना चाहिए जो आपको निश्चित रूप से मदद करेंगे:

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

  • क्षेत्र : दायरे एक मोबाइल डेटाबेस है: SQLite और कोर डेटा के लिए एक प्रतिस्थापन।

  • स्क्वायर और इंक द्वारा एंड्रॉइड और जावा के लिए रेट्रोफ़िट प्रकार-सुरक्षित HTTP क्लाइंट, एक स्मार्ट-तरीका-से-उपयोग-रेट्रोफ़िट सीखना होगा

और डेटाबेस के लिए आपका सिंक तर्क जैसे: सर्वर पर MySQL डेटाबेस के साथ एंड्रॉइड फोन पर SQLite डेटाबेस को कैसे सिंक करें?

सभी नए शिक्षार्थियों को शुभकामनाएँ। :)


एक स्मार्ट-वे-टू-यूज़-रेट्रोफिट का लिंक मर चुका है
ग्रेग होल्स्ट

@GregHolst अपडेट किया गया।
प्रतीक्षित बुटानी

3
अभी भी नीचे है। या लॉगिन की आवश्यकता है? Archive.org में यह है: web.archive.org/web/20160316222227/https://futurestud.io/blog/…
bobpaul

24

यदि आप इसे स्वयं लिखते हैं तो ये कुछ बिंदु हैं जिन्हें ध्यान में रखना चाहिए

डिवाइस और सिंक सर्वर के बीच उचित प्रमाणीकरण

डिवाइस और सर्वर के बीच एक सिंक प्रोटोकॉल। यह आमतौर पर 3 चरणों में जाएगा, प्रमाणीकरण, डेटा एक्सचेंज, स्टेटस एक्सचेंज (जो ऑपरेशन काम किया और जो विफल रहा)

अपना पेलोड प्रारूप चुनें। मेरा सुझाव है कि वास्तविक डेटा का प्रतिनिधित्व करने के लिए सिंकल्स आधारित XML को JSON आधारित प्रारूप के साथ मिश्रित किया गया है। तो प्रोटोकॉल के लिए SyncML, और वास्तविक डेटा के लिए JSON का आदान-प्रदान किया जा रहा है। JSON Array का उपयोग करना, डेटा में हेरफेर करना हमेशा पसंद किया जाता है क्योंकि JSON Array का उपयोग करके डेटा तक पहुँचना आसान होता है।

क्लाइंट और सर्वर दोनों पर डेटा परिवर्तन का ट्रैक रखना। आप आईडी के एक चैंज को बनाए रख सकते हैं जो बदल जाते हैं और सिंक सत्र के दौरान उन्हें उठाते हैं। इसके अलावा, चैंज को साफ करें क्योंकि ऑब्जेक्ट्स को सफलतापूर्वक सिंक किया गया है। आप सिंक्रनाइज़ेशन स्थिति की पुष्टि करने के लिए बूलियन चर का उपयोग भी कर सकते हैं, अर्थात सिंक के अंतिम समय में। यह अंतिम उपयोगकर्ताओं के लिए उस समय की पहचान करने में मददगार होगा जब अंतिम सिंक किया जाता है।

सर्वर पर डेटा परिवर्तन के रूप में सिंक सत्र शुरू करने के लिए सर्वर से डिवाइस पर संवाद करने का एक तरीका होना चाहिए। आप C2DM का उपयोग कर सकते हैं या अपने खुद के लगातार tcp आधारित संचार लिख सकते हैं। टीसीपी दृष्टिकोण बहुत सहज है

कई उपकरणों में डेटा परिवर्तनों को दोहराने का एक तरीका

और अंतिम लेकिन कम से कम नहीं, संघर्षों का पता लगाने और संभालने का एक तरीका

आशा है कि यह एक अच्छा प्रारंभिक बिंदु के रूप में मदद करता है।


14

@Granismo समग्र पर एक महान विवरण प्रदान करता है। यदि आप यह जानना चाहते हैं कि लोग वास्तव में इस काम को किस तरह से कर रहे हैं, तो मैं आपको सुझाव देता हूं कि 2014 के Google IO ऐप के लिए Google ने क्या किया है (यह हमेशा इन ऐप के स्रोत कोड पर एक गहरी नज़र रखने लायक है जो वे जारी करते हैं। वहाँ से सीखने के लिए बहुत कुछ)।

यहाँ इसके बारे में एक ब्लॉग पोस्ट है: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

अनिवार्य रूप से, आवेदन पक्ष पर: सिग्नलिंग के लिए GCM, डेटा लाने के लिए सिंक एडॉप्टर और कंटेंट प्रोवाइडर के साथ ठीक से बात करने से जो चीजें लगातार बनी रहेंगी (हाँ, यह ऐप के अन्य हिस्सों से डीबी को सीधे एक्सेस से अलग करता है)।

इसके अलावा, यदि आप 2015 के कोड: https://github.com/google/iosched पर एक नज़र डालना चाहते हैं


Google IO ऐप का स्रोत कोड बहुत उपयोगी IMO है!
ऋचाक

10

उदाहरण के लिए, आप तालिका सिंक करना चाहते todoTableसे MySqlकरने के लिएSqlite

सबसे पहले, एक स्तंभ नाम बनाने version (type INT)में todoTableदोनों के लिए SqliteऔरMySql यहां छवि विवरण दर्ज करें

दूसरा, database_versionएक स्तंभ नाम के साथ एक तालिका नाम बनाएँcurrentVersion(INT)
यहां छवि विवरण दर्ज करें

में MySql, जब आप करने के लिए एक नया आइटम जोड़ने todoTableया अद्यतन आइटम, आप +1 द्वारा इस मद के संस्करण को अपग्रेड करना होगा और भी उन्नयनcurrentVersion यहां छवि विवरण दर्ज करें

में Android, तो समन्वयन करना चाहते हैं (मैनुअल प्रेस सिंक बटन या एक सेवा अवधि समय के साथ चलने से):

आप अनुरोध को Sqliteवर्तमान सर्वर (वर्तमान में यह 1 है) के साथ सर्वर को भेज देंगे ।
फिर सर्वर में, आप पाते हैं कि किस MySqlसंस्करण में संस्करण से अधिक मूल्य हैSqlite वर्ट्वेयर (1) फिर एंड्रॉइड पर प्रतिक्रिया (इस उदाहरण में संस्करण 2 के साथ आइटम 3 एंड्रॉइड पर प्रतिक्रिया देगा)

इसमें SQLite, आप वर्तमान आइटम को todoTableचालू करने और अपग्रेड करने के लिए नया आइटम जोड़ेंगे या अपडेट करेंगे


1
आपका विचार शानदार है लेकिन फिर भी टेबल डिज़ाइन को ठीक से नहीं समझा जा सकता है। बाकी सेवाओं और उचित सिंक्रनाइज़ेशन सेवा के साथ-साथ यह काम करता है
अहसानाली सुथार

6

Parseplatform.org पर देखें । यह ओपन सोर्स प्रोजेक्ट है।

(साथ ही आप back4app.com पर उपलब्ध वाणिज्यिक पैकेज के लिए जा सकते हैं ।)

यह एक बहुत ही सीधे आगे और उपयोगकर्ता के अनुकूल सर्वर साइड डेटाबेस सेवा है जो एक शानदार एंड्रॉइड क्लाइंट साइड एपीआई देता है


फ्री प्लान्स क्या हैं जो ऑफर करते हैं?
प्रखर मोहन श्रीवास्तव

12
http://parse.com/ बंद हो गया है।
चिंतन राठौड़

4
आप अभी भी parse.com कार्यक्षमता का उपयोग कर सकते हैं, लेकिन अपने स्वयं के सर्वर पर, वे
खुल गए हैं

3

इसे पूरा करने का एक तरीका सर्वर साइड एप्लिकेशन है जो डेटा की प्रतीक्षा करता है। HttpRequestजावा में वस्तुओं का उपयोग करके डेटा भेजा जा सकता है या आप अपनी खुद की TCP/IPडेटा ट्रांसफर उपयोगिता लिख सकते हैं । डेटा को JSONप्रारूप या किसी अन्य प्रारूप का उपयोग करके भेजा जा सकता है जो आपको लगता है कि उपयुक्त है। यदि संवेदनशील जानकारी हो तो सर्वर पर भेजने से पहले डेटा को एन्क्रिप्ट भी किया जा सकता है। सभी सर्वर एप्लिकेशन को करना है बस HttpRequestsडेटा के अंदर आने और उसे पार्स करने की प्रतीक्षा करें और इसे कहीं भी स्टोर करें।


स्थानीय ऐप और सर्वर में अपडेट किए गए डेटा की जांच कैसे करें? और एक साथ विलय कैसे करें? यह अच्छा नहीं है कि मैं JSON द्वारा सभी रिकॉर्ड भेजूं या उन्हें मर्ज करने के लिए आवेदन करूं। तुम क्या सोचते हो?
ओमिद नाज़फी

2
आप एक ध्वज का उपयोग कर सकते हैं, जैसे "सर्वर पर" इंट / बूल 1/0 के साथ हां या नहीं के लिए। जब डेटा का रिकॉर्ड / फ़ाइल / ब्लॉक भेजा जाता है, तो सर्वर पर सफलता की जांच करें, और बिट को हां में फ्लिप करें। तब यदि आप SQLite जैसी किसी चीज़ का उपयोग कर रहे हैं, तो आप "SELECT * FROM my_table WHERE भेजे = 0" टाइप करके कोई भी नया रिकॉर्ड भेज सकते हैं
Evan R.

1

मेरा सुझाव है कि हेसियन के समान एक द्विआधारी webservice प्रोटोकॉल का उपयोग करना चाहिए । यह बहुत अच्छी तरह से काम करता है और उनके पास एक Android कार्यान्वयन है। यह थोड़ा भारी हो सकता है लेकिन आपके द्वारा बनाए जा रहे एप्लिकेशन पर निर्भर करता है। उम्मीद है की यह मदद करेगा।


1

@Granismo एंड्रॉइड सिंक घटकों का एक बड़ा अवलोकन देता है।

SyncManagerAndroid लाइब्रेरी एंड्रॉइड सिंक फ्रेमवर्क (AbstractThreadedSyncAdapter.OnPerformSync) में प्लग करने के लिए एक सरल 2-वे सिंक कार्यान्वयन प्रदान करता है।

https://github.com/sschendel/SyncManagerAndroid

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