2012-03-05 20 views
19

CoreData (SQLite ....) kullanımıyla ilgili NSCoding (NSKeyedArchiver ...) avantaj ve dezavantajlarını açıklayan bir makale aradım.NSCoding VS Çekirdek verileri

Çok sayıda seçenek var, kendi özel ikili yazıcımı/yazarımı uygulayabilir veya plists/xml/json kullanabilirim ... veya SQLite veya NSCoding'i kullanabilirim.

Şu an kayboldum. Herhangi bir gövde, MAIN özellikleri arasındaki farkın ne olduğunu açıklayabilir mi?

+2

Muhtemel Kopyaları: http://stackoverflow.com/questions/4989609 http://stackoverflow.com/questions/840634 –

+2

sqlite, coredata içinde kabul edilir. Ve önerdiğiniz ilk bağlantı, özellikle sqlite3 vs nscoding hakkında konuşuyor; çok cevapsız. Daha genel sorular soruyorum. Verilerle uğraşmak için neden bu kadar çok seçenek var. Bir sqlite blob dosyaları serileştirilirse, bu – LolaRun

cevap

30

Ne tür bir veriyi kaydetmek istediğinize ve yalnızca dahili olarak mı kullanacağınıza veya verileri harici bir hizmetle değiştirmeniz gerektiğine bağlıdır.

NSCoding genellikle bir veri toplayıcıdır. Bir çok yerleşik nesne, onları ikili bir akış olarak kaydetmenize izin veren NSCoder protokolünü uygular (dosya, bir BLL'nin bir BLOB'sinde, vb.) NSKeyedArchiver, bir dize etiketine dayanarak bu tür akışlarda arama artığı sağlar. Bir sözlük gibi biraz ama sadece dizeleri anahtar olarak kullanabilirsiniz. Bu yaklaşım, bazen farklı sınıfların bazı nesnelerini devam ettirmek zorunda kalırsanız iyidir.

Ancak aynı sınıfın birçok nesneler varsa, daha iyi bir veritabanı yaklaşım, SQLite veya CoreData için gidersiniz. CoreData, veri modelinizi tasarlayan bir çok şeyi kolaylaştıran SQLite etrafında bir paketleyicidir ve SQL deyimlerini yazmak zorunda kalmadan, DB'nin perde arkasındaki sorguları yapar. CoreData'da sınıflarınızı tanımlarsınız ve sınıfın her bir örneği kalıcı olabilir, yani nesnenin üyelerini her zaman hafızada tutmadan geri alabilirsin. Bu, birçok yapısal veriyi saklamak için çok uygun bir yoldur. Örneğin, bir web tarayıcısı yazdıysanız, kullanıcının yer imlerini ad, URL ve belki de en son ziyaret edilen zaman ile saklayabilirsiniz.

XML ve JSON için, verileri yalnızca yerel olarak aygıta kullanırsanız, belirli bir avantaj yoktur. Bazı harici servislerle iletişim kurmanız gerekiyorsa, XML/JSON nesnelerini daha sonra kullanmak üzere olduğu gibi önbelleğe almayı/kaydetmeyi düşünebilirsiniz. Diğer yaklaşım, bu veriyi ihtiyaç duyduğunuz her zaman iç veri yapılarınızdan (yukarıya bakınız) yeniden oluşturmak olacaktır.

Veri modelinizi kendiniz tasarlıyorsanız, plist kullanmak için daha az puan görürüm, ancak belki biri beni düzeltir.

DÜZENLEME: Buraya NSCoding, Core Data ve bonus olarak SQLite'u kullanma hakkında öğreticiler için kısa bir bağlantı başvurusu ekleyin.

UPDATE 12.01.2016: Kalıcılık çözümleri arıyorsanız Realm numaralı telefonu da incelemenizi öneririz.

+0

, bu, en küçük ikili veri parçalarını elde etmek için serileştirmenin en iyi olduğu anlamına gelebilir. Ayrıca, bellek içi canlı nesne örneklerinin çoğaltmasını kaldıran conditionalObjectEncodings için NSCoding'i kullanabilirsiniz. Bu soruyu sormamın nedeni, herkesin Coredata-SQLite ile konuşup önerdiğidir, ama bu avantajı görmüyorum Büyük bir veri kaynağına karşı inşa etmedikçe ve hepsini belleğe koyamazsınız. Haklı mıyım – LolaRun

+2

Bellek ve performans optimizasyonu arasında her zaman bir denge vardır. NSCoding veya özel ikili sunumunuzla, belleğe depolanmak veya bellekte saklanmak üzere bitler üzerinde çok daha fazla kontrole sahip olursunuz, ancak bunun için kodlama ücretini daha fazla ödemeniz gerekir, bu nedenle kodun verimi size bağlı olacaktır. yetenekleri. CoreData/SQLite ile, sizin için verimli bir şekilde (arama, sorgulama, indeksleme, birleştirme, vb.) Birçok yararlı şey uygulanmaktadır. Not: CoreData nesneleri sadece gerektiğinde belleğe yüklenir, aksi takdirde db'de kalırlar. – MrTJ

+0

Mükemmel. Uygulamaların "ApplicationDocument" şablonunu kullanıyorum ve belgeleri açıp açmak gerekirse, her şeyi belleğe yüklemem gerektiğinden ve sorgulamaya gerek duymadığımdan, CoreData'nın faydalarına gerçekten ihtiyacım olmaz ve ... veritabanı işlevleri. En önemli fark gelişme maliyeti. Benim durumumda bu bir gerileme değil. Çok teşekkürler. Biraz bekleyeceğim, daha fazla cevap ve daha fazla tartışma çekebilmek için, bir cevap kabul etmeden önce, bir – LolaRun

3

Nesneler ve ilişkisel yapılar arasında her zaman bir empedans vardır. Veri erişimi genellikle uygulamanızdaki işlevselliğin bir parçası olduğu için nesneleri her zaman tercih ederim. NSCoding ile, basitlik, hata ayıklama kolaylığı ve her zaman yazmak için çok az kodla kontrol edin. Ayrıca NSCoding'i veritabanı yapılarınıza dahil etme esnekliğine de sahipsiniz.

NSCoding, nesneleri kaydetmek için kalıcı bir mekanizmadır. Arama optimizasyonu için ilişkisel yapılarınıza dizin eklerseniz ve nesne yapılarını korursanız, tüm dünyaların en iyisini, çok düşük bir maliyetle ve bakım kolaylığıyla elde edeceğinizi düşünüyorum.

8

Mattt Thompson NSHipster üzerinde NSCoding, Çekirdek Veri arasında çeşitli farklılıklar sindirilebilir dökümünü sağlar ve NSKeyedArchiver: çok hangi http://nshipster.com/nscoding/

+1

Teşekkürler, bu açık bir açıklama. – LolaRun

2

NSKeyedArchiver birlikte NSCoding verileri depolamak için harika bir yoldur zaten büyük cevaplar, eklemek için NSUserDefaults için büyük (veya uyumsuz veri türü) ancak CoreData için çok küçük ve sayısız.

İlgili konular