2011-01-18 25 views
36

Diyelim ki Çekirdek Verilerde saklanan kitapların bir listesi var. Bir kitabı birincil anahtar kimliğine göre aramak istiyorum. Çekirdek Veriler tarafından oluşturulan sqlite dosyasının her tabloda bir ID sütunu olduğunu biliyorum, ancak bu zaten bana açık görünmüyor.temel veri - veritabanındaki bir satırın birincil anahtar kimliği

Herhangi bir öneriniz var mı?

Teşekkürler! Çekirdek Verilerdeki bir nesne örneğinin benzersiz kimliği,

cevap

94

-[NSManagedObject objectID]. -[NSManagedObjectID URIRepresentation] aracılığıyla serileştirilebilir. objectID'u kalıcı bir mağaza koordinatöründen -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:] ile geri alabilir ve ardından nesneyi yönetilen bir nesne bağlamından -[NSManagedObjectContext objectWithID:] ile alabilirsiniz.

ANCAK

Sen Çekirdek Veri değil bir ORM olduğunu akılda tutmak gerekir. Bir object graph management framework. Bu, arka uç olarak sadece bir uygulama detayı olan SQLite (ve benzersiz satır kimlikleri) kullanır. Kendinizi SQL/RDBMS zihniyetinden ne kadar erken çıkartabiliyorsanız, o kadar hızlı bir şekilde Core Data'dan memnun kalacaksınız. Depolanmış bir kimlikten bir nesne bulmaya çalışmak yerine, neden bu nesneye ve hangi nesneye ihtiyacı olduğunu düşünün. sınıfın Foo örneğidir sınıfının Bar örneğine elde edebilmek gerekiyorsa, neden sadece Bar için Foo gelen bir ilişki oluşturmak ve uygun Foo örneğinde dernek hedef olarak uygun Bar örneğini ayarlanmamış. Çekirdek Verileri nesne kimliklerini takip etsin.

+33

'Çekirdek Veriler bir veritabanı değil' için size bir artı daha verebilirdim. – Abizern

+5

Bir tablo görünümü hücre seçiminden, bir ayrıntı görünümü denetleyicisine aklına gelen geçiş verileriyle bir nesneyi almanız gereken ortak kullanım durumları vardır. Nesnenin kendisini geçebilirsiniz, ancak genellikle VC'de farklı bir bağlam kullanıyorsanız bunu yapmak istemezsiniz. – memmons

+1

@Michael: Kesinlikle. Bunu yapmak için en iyi uygulama nedir? – Noah

42

Barry Wark'ın dediği gibi, her zaman Çekirdek Verilerin bir orm olmadığını unutmayın. Saf SQL ayrıntıları kullanıcıya maruz kalmaz ve her satır sadece bir nesnedir. Bu arada, bazen "birincil anahtar" a erişmeniz gerekir, örneğin coredata db'yi harici sql veritabanlarıyla senkronize etmeniz gerektiğinde (benim durumumda INSERT'den sonra bir nesnenin durumunu değiştirmek için bir geri çağırma işlevinde buna ihtiyacım vardı) Uzaktan db içinde başarı ile). Bu durumda, kullanabilirsiniz:

gibi bir dize döndürür
objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString] 

: x-CoreData: hiç CoreData kullandığı benzersiz id // 76BA122F-0BF5-4D9D-AE3F-BD321271B004/Nesne/p521 o nesneyi tanımlayın.

o eşsiz kimliğe sahip bir nesne geri almak istiyorsanız:

NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]]; 

Not: Alıcı henüz CoreData Bağlamında kaydedilmedi eğer nesne kimliği geçici değeri o olacak olduğunu unutmayın Nesne kaydedildiğinde değiştirin.

+1

tam olarak! Aynı problem. Bu kimliği sunucuya uzaktan mySQL'e bir giriş yapmak için varlık ayrıntılarını göndermek ve ardından yanıt olarak, sunucunun aynı objectID ile benzersiz bir kimlik oluşturmasını sağladı. Nesne formu objectId olsun ve sunucu kimliğini içinde saklayın. –

+0

nyc açıklama ve kodu için teşekkür ederiz… sorunumu çözdüm .. :) –

+0

@donnit, amogh Peki, içerik dışında bir siteyi kaydettiğim bir durumda ne yapacağım ve daha sonra sunucu sonunu doldurmam gerektiğinde Kimlikler ve güncelleme değerleri eşleştirilebilir mi? Ayrıca, veritabanında kimlik bulunmuyorsa yeni bir nesne ekleyebilir. Bunu nasıl başarabilirim? – Pavan

İlgili konular