2016-04-14 4 views
0

Я создаю приложение, которое позволяет пользователям называть цвета. Например, пользователи могут называть # 00FFFF как «зеленый». Мне нужно сохранить эти имена и соответствующие цвета в Core Data.Как сохранить пары ключевых значений в данных ядра?

Я думаю, что лучший способ сделать это - сохранить пары в качестве пар ключ-значение - цвет как ключ, а имена в качестве значений. Но когда я создал новый объект и добавил два атрибута, у меня нет способа сообщить Core Data, что цвет является «первичным ключом» или чем-то еще. И я не могу сказать Core Data, чтобы получить соответствующие имена.

Я подумал о некоторых обходных решениях, но они недостаточно «осторожны».

  1. Сохраните пары ключ-значение в качестве словаря в NSUserDefaults. Но я могу сохранить только [String: AnyObject]. Мне нужен [Int: String]. Я знаю, что я могу преобразовать ints в строки, но это делает код более нечитаемым и невоспроизводимым. Кроме того, мне нужно указать значение для ключа от AnyObject до String, что совсем другое, что мне не нравится. Это похоже на то, что дженерики не были изобретены.

  2. Я могу сохранить цвет и имя в объекте Core Data. Когда я хочу найти то, что соответствует названию цвета, я использую линейный поиск по всему предмету.

Как это:

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

Я хотел бы сделать это на одном дыхании. Вышеприведенный код не очень элегантный, вы знаете, что я имею в виду?

Есть ли способ сохранить пары цветов в базовых данных, чтобы я мог сделать что-то вроде этого?

var theNameOfGreen = colorNameDictionary[0x00ff00] 

ответ

1

Что рекомендует Dmytro, должен быть правильный способ сделать это в Core Data. Я бы сказал, что это создает много накладных расходов для чего-то, что может быть очень легко. Почему бы не сохранить его в списке свойств? Просто создайте его в Xcode, добавьте словарь и введите имена как ключ, а соответствующий цвет - как значение.

Чтобы загрузить словарь из файла Plist:

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) 

Чтобы сохранить словарь в файл Plist:

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

Но можно ли программно отредактировать plist? – Sweeper

+0

Да, см. Мое редактирование. –

+0

Хм ... Похоже, неплохо использовать плиты в этой ситуации.Но я не могу понять ваш код. Но спасибо за идею в любом случае! Я сделаю еще несколько исследований по plists! – Sweeper

-1

Вам нужно использовать «Отношения», один к одному, я думаю.

Создайте новый объект «ИменаForColors» и добавьте 1 атрибут «имя» (например) и 1 «цвет» цвета (например).

Затем создайте второй объект «Цвета» и добавьте 1 атрибут «цвет» (например) и 1 «имя» отношения (например). И свяжите их.

Если я вас правильно понимаю.

+0

Основные данные не имеют понятия, как «первичный ключ». Только NSManagedObjectID как уникальный идентификатор. –

Смежные вопросы