2016-04-14 21 views
0

Kullanıcıların renkleri adlandırmasına izin veren bir uygulama yapıyorum. Örneğin, kullanıcılar # 00FFFF adını "yeşil" olarak adlandırabilir. Bu adların ve karşılık gelen renklerin Temel Veriler'de saklanması gerekir.Temel Veriler'de anahtar değer çiftleri nasıl kaydedilir?

Bunu yapmanın en iyi yolu, çiftleri anahtar-değer çiftleri olarak kaydetmek, anahtar olarak renk ve değerler olarak isimlerdir. Ancak, yeni bir varlık oluşturduğumda ve iki özelliği eklediğimde, Çekirdek Verilere, rengin "birincil anahtar" veya başka bir şey olduğunu söylemenin bir yolu yok. Ve Core Data'ya bana karşılık gelen isimleri almasını söyleyemem.

Bazı geçici çözümler düşündüm ancak yeterince "hızlı" değiller.

  1. Anahtar değer çiftlerini NSUserDefaults'da sözlük olarak kaydedin. Ama oraya sadece [String: AnyObject]'u kaydedebiliyorum. İhtiyacım olan [Int: String]. İnekleri dizelere çevirebileceğimi biliyorum, ancak bu sadece kodu daha okunaklı ve hızlı olmayan hale getiriyor. Ayrıca, anahtarın değerini AnyObject'dan String'a çevirmem gerek. Bu da sevmediğim başka bir şey. Jenerikler icat edilmemiş gibi.

  2. Renk ve adı bir Çekirdek Veri birimine kaydedebilirim. Bir rengin karşılık gelen ismini bulmak istediğimde, her şeyden lineer arama yapıyorum. Bunun gibi

:

for item in allTheColorNames { 
    if item.color == theStuffIWantToFind { 
     // do something 
     break 
    } 
} 

ben tek seferde bunu yapmak isterdim. Yukarıdaki kod çok zarif değil, ne demek istediğimi biliyor musun?

Renk Verisi çiftlerini Çekirdek Verilerde saklamak için bir yol var mı, böylece böyle bir şey yapabilirim?

var theNameOfGreen = colorNameDictionary[0x00ff00] 

cevap

1

Dmytro'nun önerileri, Çekirdek Veriler'de doğru şekilde yapılmalıdır. Bunun çok kolay olabilecek bir şey için çok fazla yük yarattığını iddia ediyorum. Neden bir özellik listesinde saklamıyorsunuz? Sadece Xcode'ta bir tane oluşturun, bir sözlük ekleyin ve isimlere bir anahtar ve ilgili renk olarak değer verin.

bir plist dosyasından bir sözlük yüklemek için:

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
let documentsDirectory = paths.objectAtIndex(0)as NSString 
let path = documentsDirectory.stringByAppendingPathComponent("MyFile.plist") 

let fileManager = NSFileManager.defaultManager() 

// Check if file exists 
if(!fileManager.fileExistsAtPath(path)) 
{ 
    // If it doesn't, copy it from the default file in the Resources folder 
    let bundle = NSBundle.mainBundle().pathForResource("DefaultFile", ofType: "plist") 
    fileManager.copyItemAtPath(bundle, toPath: path, error:nil) 
} 

var data = NSMutableArray(contentsOfFile: path) 

bir plist dosyasına bir sözlük kaydetmek için:

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
let documentsDirectory = paths.objectAtIndex(0) as NSString 
let path = documentsDirectory.stringByAppendingPathComponent("MyFile.plist") 

data.writeToFile(path, atomically: true) 
+0

Ancak plist programatik olarak düzenleyebilir misiniz? – Sweeper

+0

Evet, düzenlememe bakın. –

+0

Hmm ... Bu durumda plistleri kullanmak oldukça iyi bir fikir gibi görünüyor.Ama kodunuzu tam olarak anlayamıyorum. Ama yine de fikir için teşekkürler! Plisten biraz daha araştırma yapacağım! – Sweeper

-1

"İlişkiler" ifadesini kullanmalısınız, sanırım bire bir.

Yeni bir varlık "NamesForColors" oluşturun ve "name" (örneğin) ve 1 ilişki "color" (örneğin) 1 niteliği ekleyin. Daha sonra ikinci "Renkler" öğesi oluşturun ve "color" (örneğin) ve 1 ilişki "name" (örneğin) 1 niteliği ekleyin. Ve onları bağlayın.

Seni doğru anlıyorsam.

+0

Çekirdek Verileri "birincil anahtar" gibi kavram yoktur. Benzersiz bir kimlik olarak yalnızca NSManagedObjectID. –

İlgili konular