Android Uygulaması ile web sunucusu arasında veri senkronizasyonu [kapalı]


262

Android Uygulaması ile Sunucu arasında veri (db kaydı, medya gibi) senkronize etmek istiyorum. Eğer gördüyseniz Evernoteveya benzeri uygulamalar, kesinlikle ne demek istediğimi anlıyorum.

Bazı sorularım var (DB kayıtlarını senkronize etmek istediğimizi hayal edin):

  1. Her kullanıcının kendisi için sunucu alanı vardır ( Evernoteveya gibi Dropbox). Belki kullanıcı cep telefonu ile yeni kayıtlar oluşturur ve sunucuda yeni kayıtlar oluşturur. Bu kayıtları nasıl eşleştirebilirim? Aynı kimliğe sahip kayıtlar varsa Bana hangi algoritmaları önerirsiniz?

  2. JSON hariç , cep telefonu cihazı ile sunucu arasında veri göndermenin bir yolu var mı?

  3. Eğer SyncAdapter ve ContentProvider benim sorunları çözebilir, benim için tam olarak açıklayınız. (Bana bazı örnekler veya öğreticiler sunabilirseniz VEYA aramamı genişletmek / yönlendirmek için herhangi bir tavsiye veya anahtar kelime de takdir edilecektir).


1
Öncelikle, sunucu ile iletişim protokolünüzü, dolayısıyla hangi verileri aktarabileceğinizi ve nasıl yapılacağını belirlemeniz (karar vermeniz) gerekir.
hovanessyan

Bu benim için önemli, SQLlite verilerini aktarın. ama diğer verileri nasıl aktaracağımı bilirdim. Protokol ile ilgili ne demek istediğini anlamıyorum. lütfen daha fazla açıklayın.
Omid Nazifi


1
çeşitli platformlarda (android, windows, ios), web sunucuları, veri sağlayıcıları (salesforce, sap sağlayıcıları), veritabanları (sqlserver, mysql ...)
konylabs ürünü denemek

Yanıtlar:


311

Tüm sorularınızı daha büyük soruyu yanıtlayarak cevaplamaya çalışacağım: Bir web sunucusu ile android uygulaması arasında verileri nasıl senkronize edebilirim?


Web sunucunuz ve bir android uygulaması arasında veri senkronizasyonu, android cihazınızda birkaç farklı bileşen gerektirir.

Kalıcı Depolama:

Telefonunuz aslında web sunucusundan aldığı verileri bu şekilde depolar. Bunu gerçekleştirmenin olası bir yolu, bir Sqlite veritabanı tarafından desteklenen kendi özel ContentProvider'ınızı yazmaktır. Bir içerik sağlayıcı için iyi bir öğretici burada bulunabilir: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

Bir ContentProvider sizin depolanan veri ile etkileşim tutarlı bir arayüz tanımlar. İsterseniz, diğer uygulamaların verilerinizle etkileşime girmesine de izin verebilir. ContentProvider'ınızın arkasında bir Sqlite veritabanı, Önbellek veya isteğe bağlı bir depolama mekanizması olabilir.

Kesinlikle bir Sqlite veritabanı ile bir ContentProvider kullanmanızı öneririm, istediğiniz herhangi bir java tabanlı depolama mekanizması kullanabilirsiniz.

Veri Değişim Biçimi:

Bu, web sunucunuz ile android uygulamanız arasında veri göndermek için kullandığınız biçimdir. Bu günlerde en popüler iki biçim XML ve JSON'dur. Biçiminizi seçerken, ne tür bir serileştirme kitaplığı bulunduğunu düşünmelisiniz. XML için benzer kütüphanelerin bulunduğundan emin olsam da, json serileştirmesi için gson adında harika bir kütüphane olduğunu biliyorum: https://github.com/google/gson .

Senkronizasyon Hizmeti

Sunucunuzdan yeni veri alabilecek ve mobil içeriği sunucunun içeriğini yansıtacak şekilde yenileyebilecek bir tür eşzamansız görev isteyeceksiniz. İçerikte yerel değişiklikler yaptığınızda ve bu değişiklikleri yansıtmak istediğinizde de sunucuyu bilgilendirmek istersiniz. Android, bu kalıbı kolayca çözmenin bir yolu olarak SyncAdapter kalıbını sağlar . Kullanıcı hesaplarını kaydetmeniz gerekir ve ardından Android sizin için çok fazla sihir gerçekleştirir ve otomatik olarak senkronize etmenize izin verir. İşte iyi bir öğretici: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


Kayıtların aynı olup olmadığını nasıl belirlediğinize gelince, genellikle hem android cihazda hem de sunucuda sakladığınız benzersiz bir kimliğe sahip öğeler oluşturacaksınız. Aynı referansa başvurduğunuzdan emin olmak için bunu kullanabilirsiniz. Ayrıca, her zaman en yeni verileri aldığınızdan veya yanlışlıkla yeni yazılan verilerin üzerine yazmadığınızdan emin olmak için "updated_at" gibi sütun özelliklerini saklayabilirsiniz.


3
Büyük miktarda veri ne olacak? nasıl senkronize edebilirim?
Pratik Butani

4
Çok iyi açıkladı Sadece bir not var ... SyncAdapter -> "çok fazla sihir gerçekleştirin". Umarım kara büyü olarak adlandırıyorsun ... tamamen kötülük.
MRodrigues

@MRodrigues: SyncAdapter geliştirici için kara büyü olabilir ama yine de istikrar ve işlevsellik için büyü yapmak, bu diğer kütüphaneleri çok daha iyidir
Milad Metias

2
Web servisinin kendisi bir android cihazla senkronize etmek için ne gerektirir? Bahar ile mümkün mü?
16:19

58

Bugün düşünürsek , kabul edilen cevap çok eski. Bildiğimiz gibi, bu tür uygulamaları yapmanıza yardımcı olabilecek birçok yeni kütüphanemiz var.

Size kesinlikle yardımcı olacak aşağıdaki konuları öğrenmelisiniz:

  • SyncAdapter: Uygulamanızdaki senkronizasyon adaptörü bileşeni, cihaz ile sunucu arasında veri aktarımı yapan görevlerin kodunu içerir. Uygulamanızda sağladığınız zamanlamaya ve tetikleyicilere dayanarak, eşitleme bağdaştırıcısı çerçevesi eşitleme bağdaştırıcı bileşenindeki kodu çalıştırır.

  • Bölge : Bölge bir mobil veritabanıdır: SQLite ve Temel Verilerin yerine geçer.

  • Uyarlama Tip güvenli Meydanı'nda Android ve Java için HTTP istemci, Inc bilgi Must bir akıllı yönlü kullanımlı Donanım iyileştirme

Ve veritabanı gibi senkronizasyon mantığınız: Android telefondaki SQLite veritabanını sunucudaki MySQL veritabanı ile nasıl senkronize edilir?

Tüm yeni öğrencilere en iyi şanslar. :)


Akıllı-akıllı-kullanım-retrofit bağlantısı
Greg Holst

@GregHolst güncellendi.
Pratik Butani

3
Hala aşağı. Yoksa giriş mi gerekiyor? Archive.org buna sahiptir: web.archive.org/web/20160316222227/https://futurestud.io/blog/…
bobpaul

24

Bunu kendiniz yazarsanız, bunlar akılda tutulması gereken noktalardan bazılarıdır

Cihaz ile Senkronizasyon Sunucusu arasında doğru kimlik doğrulaması

Cihaz ve sunucu arasında bir senkronizasyon protokolü. Genellikle 3 aşamada geçer, kimlik doğrulama, veri değişimi, durum değişimi (hangi işlemler işe yaradı ve hangileri başarısız oldu)

Yük biçiminizi seçin. Ben gerçek verileri temsil etmek için JSON tabanlı format ile karıştırılmış SyncML tabanlı XML öneririz. Yani protokol için SyncML ve değiş tokuş edilen gerçek veriler için JSON. Verileri işlerken JSON Dizisini kullanmak her zaman tercih edilir çünkü JSON Dizisi'ni kullanarak verilere erişmek kolaydır.

Hem istemci hem de sunucudaki veri değişikliklerini takip etme. Senkronizasyon oturumu sırasında değişen kimliklerin bir değişiklik günlüğünü koruyabilir ve alabilirsiniz. Ayrıca, nesneler başarıyla senkronize edildikçe değişiklik günlüğünü temizleyin. Senkronizasyon durumunu, yani son senkronizasyon zamanını onaylamak için bir boolean değişkeni de kullanabilirsiniz. Son kullanıcıların son senkronizasyonun ne zaman yapılacağını belirlemeleri yardımcı olacaktır.

Sunucuda veri değiştikçe bir senkronizasyon oturumu başlatmak için sunucudan aygıta iletişim kurmanın bir yolu olması gerekir. C2DM kullanabilir veya kendi kalıcı tcp tabanlı iletişiminizi yazabilirsiniz. TCP yaklaşımı çok sorunsuz

Veri değişikliklerini birden çok cihazda çoğaltmanın bir yolu

Son olarak, en önemlisi, çatışmaları tespit etmenin ve ele almanın bir yolu

Umarım bu iyi bir başlangıç ​​noktası olarak yardımcı olur.


14

@ Grantismo genel olarak harika bir açıklama sağlar. İnsanların aslında bu şeyleri kimin yaptığını bilmek istiyorsanız, Google'ın 2014 Google IO Uygulaması için nasıl yaptığını incelemenizi öneririz (her zaman yayınladıkları bu uygulamaların kaynak koduna derinlemesine bir göz atmaya değer. oradan öğrenecek çok şey var).

İşte bu konuda bir blog yazısı: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

Temel olarak, uygulama tarafında: sinyal için GCM, veri alma ve düzgün bir şekilde konuşma için İçerik Sağlayıcı ile düzgün bir şekilde konuşma için Sync Adapter (evet, DB'yi uygulamanın diğer bölümlerinden doğrudan erişime karşı izole eder).

Ayrıca, 2015 koduna göz atmak isterseniz: https://github.com/google/iosched


Google IO uygulaması için kaynak kodu oldukça yararlı IMO!
Richeek

10

Örneğin, tablo senkronize etmek istediğiniz todoTablegelen MySqletmekSqlite

İlk olarak, bir sütun adı oluşturmak version (type INT)içinde todoTableikisi için SqliteveMySql resim açıklamasını buraya girin

İkinci olarak, database_versionbir sütun adıyla bir tablo adı oluşturuncurrentVersion(INT)
resim açıklamasını buraya girin

İçinde MySql, öğeye yeni bir öğe eklediğinizde todoTableveya öğeyi güncellediğinizde, bu öğenin sürümünü + 1'e yükseltmeniz ve ayrıcacurrentVersion resim açıklamasını buraya girin

Olarak Android, siz (manuel pres senkronizasyon düğmesi veya dönem zamanla yürütülen bir hizmet tarafından) senkronize etmek istediğinizde:

Bu isteği SqlitecurrentVersion ile (şu anda 1'dir) sunucuya göndereceksiniz.
Daha sonra sunucuda, MySqlsürüm değerine sahip olan öğenin SqlitecurrentVersion (1) ' den daha büyük olduğunu ve ardından Android'e yanıt verdiğini görürsünüz (bu örnekte sürüm 2'ye sahip öğe 3 Android'e yanıt verecektir)

In SQLiteekleyebilir veya yeni madde güncelleyecektir todoTableve CurrentVersion'ı yükseltme


1
Fikriniz parlak ama yine de masa tasarımını düzgün bir şekilde anlayamıyorum. Dinlenme hizmetleri ve uygun senkronizasyon hizmeti ile birlikte çalışır
Ahesanali Suthar


3

bunu gerçekleştirmek için bir yolu veri bekleyen bir sunucu tarafı uygulaması olması. Veriler HttpRequestJava'daki nesneler kullanılarak gönderilebilir veya kendi TCP/IPveri aktarım yardımcı programınızı yazabilirsiniz . Veriler, JSONbiçim veya uygun olduğunu düşündüğünüz başka bir biçim kullanılarak gönderilebilir . Ayrıca, hassas bilgiler içeriyorsa veriler sunucuya gönderilmeden önce şifrelenebilir. Tüm Sunucu uygulamasının yapması gereken sadece HttpRequestsiçeri girip verileri ayrıştırmak ve istediğiniz yere depolamaktır.


Yerel Uygulama ve sunucuda güncellenen veriler nasıl kontrol edilir? ve Nasıl birleştirilir? JSON veya herhangi bir kaydı tüm kayıtları birleştirmek için başvuruya göndermem iyi değil. ne düşünüyorsun?
Omid Nazifi

2
evet veya hayır için int / bool 1/0 içeren "sunucuda" gibi bir bayrak kullanabilirsiniz. bir kayıt / dosya / veri bloğu gönderildiğinde, sunucuda başarılı olup olmadığını kontrol edin ve biraz evet'e çevirin. SQLite gibi bir şey kullanıyorsanız, yeni kayıtlar göndermek için "SELECT * FROM my_table WHERE sent = 0" türü bir şey yapabilirsiniz
Evan R.

1

Ben benzer bir ikili webservice protokolü kullanarak öneririm Hessian . Çok iyi çalışıyor ve bir android uygulaması var. Biraz ağır olabilir ama inşa ettiğiniz uygulamaya bağlıdır. Bu yardımcı olur umarım.


1

@ Grantismo, Android senkronizasyon bileşenlerine mükemmel bir genel bakış sunar.

SyncManagerAndroid kitaplığı, Android Sync çerçevesine (AbstractThreadedSyncAdapter.OnPerformSync) takmak için 2 yönlü basit bir senkronizasyon uygulaması sağlar.

https://github.com/sschendel/SyncManagerAndroid

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.