2011-04-04 12 views
6

Core Data'da yeniyim ve kavramsal olarak bazılarıyla uğraşıyorum (anladığım SQL'e göre). Ben lokalize varyantları saklamak için her iki taraftaki olanlar name s (string) istiyorumÇekirdek Veriler'de yerelleştirilmiş bir dize türü nasıl gösterilir?

"Category" entity, which has a name, and a relationship to-many Products 
"Product" entity, which has a name 

:

ben gibi basitlik uğruna görünen bir model oluşturmak için çalışıyorum. Bu başka bir birleştirmeyi ima eder. Az sayıda olası lokalizasyon var. Her yerelleştirmeyi bireysel bir öznitelik olarak atabileceğimi biliyorum ("name_en", "name_de", vs), fakat bu ölçeklemiyor ve bunu gerçekleştirmenin "doğru" yolunu anlamak istiyorum.

Bağırmamın burada iki tane daha varlık istediğimi, Yerelleştirmelerle ilgili bir lokalizasyon (yalnızca olası yerelleştirmeleri içeren) ve Yerelleştirme ile ilgili bir tür YerelleştirilmişString'i istediğimi anlatır. Ancak Xcode, Ters ilişkiler kurmama, vb. Konusunda beni uyardı.

Core Data model tasarımını derinden güldüren biri, yeni bir kişinin bu sorun hakkında nasıl düşüneceğini anlamasına yardımcı olabilir mi?

(My sonraki sorun mevcut olduğu her yerelleştirme adını ayarlamak sağlayan esrarlı çok mafsallı UI binası olacak, ama bu soruşturmanın bir başka dizi olacak. :)) Bilmiyorum

+0

Bu dizeler kullanıcılar tarafından giriliyor mu veya yalnızca uygulama tarafından kullanılıyor mu? Uygulamanızı yerelleştirmek için Temel Verileri arka uç olarak kullanıyorsanız, sağlanan yerelleştirme araçlarını kullanmanız daha iyi olur. Aksi halde fluchtpunk'un cevabı ile aynı fikirde olurum. – sosborn

+0

@sosborn: Kullanıcılar tarafından girildi. Aksi takdirde bu durumda tavsiyelerinize kesinlikle katılıyorum. (Ve bu da iyi bir öğrenme örneği gibi görünüyordu, çünkü varlık ilişkisinden geçtiğim CD derslerinden daha ilginçti.) Teşekkürler. –

cevap

14

Ben temel verileri groks biri olarak nitelemek ama geçmişte böyle bir şey kullandıysanız: Something yılında enter image description here

name ingilizce adıdır. Dolayısıyla, ingilizce cihazlar arasındaki ilişkiyi aramak zorunda kalmıyorum (bu da benim uygulamam için cihazların% 70'ini kapsamaktadır).
Something alt sınıfında localizedName alt sınıfında bir getter var; bu kod, geçerli olarak kullanılan dil kodunun adını veya dizesini döndürür.

Bunu yaptığımda, yerelleştirilmiş dizeyi name özelliğine kaydedebileceğimi düşündüm çünkü diller genellikle geliştiriciler tarafından kullanılmayan aygıtlarda sık sık değişmiyor. Ama sonunda buna karşı karar verdim çünkü bu bir performans sorunu değildi.

ben var olmayan performans sorunları karşısında kullanabileceğini düşündüm başka varyantı: enter image description here

currentLanguageString temelde geçerli dilin yerelleştirilmiş dize işaret eder. Dil her değiştiğinde değiştirilir (uygulama ilk başlatıldığında tüm vakaların% 99,9'unda bu bir kez olur).


Eğer Something varlık birden fazla dize varsa LocalizedString özel olarak lokalize istediğiniz dize için oluşturulan alt sınıflarından soyut üst sınıf yapar.
Böyle garip yapıları kullanmanız gerekir, çünkü birden fazla varlıkla ilişki kuramazsınız.


Yoksa ne yaptığınızı biliyorsanız, bu tarafa giderseniz

enter image description here

ama emin olmak zorunda uyarı "hayır ters ilişki" görmezden Hala kullanılmakta olan LocalizedString nesnesini asla silmeyeceksiniz. Tutarsız bir depolamayla son vermek istemezsiniz.

+0

Detaylı yanıt için çok teşekkür ederim. İyi şeyler. Beni en çok ilgilendiren son noktanız. SQL'de LocalizedString tablosu tuple (stringID, languageCode, text) gibi olabilir, fakat dediğiniz gibi, bu tür bir non-inverse jenerik depolama burada doğal değildir. Açıkladığınız şekilde düşüneceğim. Teşekkürler. –

+2

Çok sayıda dizeniz varsa, veritabanınızı muazzam hale getirebilirsiniz. Arama yapmak da oldukça zor/yavaştır, ancak aksi halde çalışır –

+0

Harika bir açıklama. Teşekkürler! –

İlgili konular