2011-08-02 29 views
6

İçerik sağlayıcılar hakkında biraz kafam karışık. Uygulamamda birden fazla etkinliğim varsa, bunların her biri içerik sağlayıcısının kendi örneğini alır mı? sadece bir sınıf/arayüz mü?Android - sqlite içerik sağlayıcılar ve çok dilli

Bir etkinlikte, veritabanına aynı anda yazarak çok sayıda iş parçacığım olacak. Bir iş parçacığının aynı anda yazmasına nasıl izin veririm? Sadece SQLiteDatabaseLockedException yakalamak mı

ardından uyku yeniden denemek parçacığı koydu? Veya daha iyi bir yolu var mı?

Etkinlik duraklatıldığında/yok olduğunda veritabanı kilitleniyor mu? Öyleyse içerik sağlayıcının kendisine karşı senkronize bir kilit oluşturabilir miyim?

cevap

-4

Bir ContentProvider kullanıyorsanız, okuma/yazma işleminin kaç tane konu olduğunu umursamadığınızı düşünüyorum: Android platformu tüm çağrılarınızı tek bir iş parçacığına dönüştürmeyi ve eşitlemeyi ve kilitlemeyi sıralamayı işler. Veritabanınızı açıp okuma/yazma işlemine giriyorsunuz ve herkes ContentProvider arabiriminden konuşuyor.

+5

Android dökümanlar "bu ContentProvider yöntemleri farklı süreçler ve iş parçacığı çeşitli ContentResolver nesneler çağrılabilir Çünkü onlar bir iş parçacığı güvenli bir şekilde uygulanması gerekir." – kakopappa

+1

Bu yanlış. Android platformu böyle bir şey yapmaz. –

+0

Hm, 50.5k değeri ve böyle bir cevap? –

1

Üzgünüz, benim kayıtsız kullanıcı tanımlama yüzden Femi cevabı doğru oy veremezsiniz kaybetti.

belgeleri http://developer.android.com/guide/topics/providers/content-providers.html bir sorgu başlatıldığında, Android sistem sorgunun hedef ve o ayakta ve çalışır durumda olmasını sağlar içerik sağlayıcı tanımlayan sistemi tüm ContentProvider nesneleri aniden" ile bu onaylar;. Sana asla Aslında, bunu doğrudan ContentProvider nesnelerle doğrudan ele almazsınız.Genellikle ContentProvider'ın her türünün yalnızca bir örneği vardır, ancak farklı uygulamalarda ve süreçlerde birden fazla ContentResolver nesnesiyle iletişim kurabilir. süreçler arasında ContentResolver ve ContentProvider sınıfları tarafından gerçekleştirilmektedir. "

+1

Sorunuzu/cevabınızı moderatör dikkati için işaretler ve diğerlerini seçerseniz, iki hesabın birleştirilmesini isteyebilirsiniz. Ayrıca kayıt düşünebilirsiniz :) – forsvarir

3

Eğer veritabanları ile doğrudan çalışmak ve ayırımını birden fazla yazarları varsa t iş parçacığı eşzamanlılık sorunları yaşayabilirsiniz.

ContentProvider

nedenle erişim parçacığı güvenli uygulaması gerektiğini, aynı anda birkaç programlardan erişilebilir. En kolay yol, synchronized anahtar kelimesini ContentProvider tüm yöntemlerinin önünde kullanmaktır, böylece yalnızca bir iş parçacığı aynı anda bu yöntemlere erişebilir.

Android ContentProvider veri erişimi eşitler gerektirir yoksa

, AndroidManifest.xml dosyasında <provider> tanımında android:multiprocess=true niteliğini ayarlayın. Bu, her bir istemci işleminde sağlayıcının bir örneğinin oluşturulmasına izin verir, böylece işlem arası iletişimi (IPC) gerçekleştirme gereği ortadan kalkar.

+1

Evet öyle: Ben set yoksa öylesine http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –

+0

Ben alamadım multiprocess = true android, ContentProvider'a tüm erişimi senkronize eder mi? Bu durumda senkronize anahtar kelimeyi kullanmak gerekli değil, değil mi? Bu durumda Femi'nin cevabı doğru mu? – Gus