Dizi CoreData'ya nasıl kaydedilir?


94

Dizimi Core Data'ya kaydetmem gerekiyor.

let array = [8, 17.7, 18, 21, 0, 0, 34]

Bu dizinin içindeki değerler ve değerlerin sayısı değişkendir.

1. NSManagedObject sınıfımın içinde ne beyan ederim?

class PBOStatistics: NSManagedObject, Equatable {
    @NSManaged var date: NSDate
    @NSManaged var average: NSNumber
    @NSManaged var historicAverage: NSNumber
    @NSManaged var total: NSNumber
    @NSManaged var historicTotal: NSNumber
    @NSManaged var ordersCount: NSNumber
    @NSManaged var historicOrdersCount: NSNumber
    @NSManaged var values: [Double]  //is it ok?

    @NSManaged var location: PBOLocation

}

2. .xcdatamodel'imin içinde ne beyan ederim?

görüntü açıklamasını buraya girin

3. Bunu Varlığıma nasıl kaydederim? (MagicalRecord kullanıyorum)

let statistics = (PBOStatistics.MR_createInContext(context) as! PBOStatistics)
statistics.values = [8, 17.7, 18, 21, 0, 0, 34] //is it enough?

"Olmalı" diye bir şey yoktur, DB tasarımı size bağlıdır, örneğin, bu verileri uygulamanızda depolamanın en verimli yolu olduğu kanıtlanırsa, tarihleri ​​veya metin biçimini de kullanabilirsiniz.
Canlı

Yani benim içinde NSManagedObject: @NSManaged var values: [Double]iyi mi? Bunu .xcdatamodelkaydetmek için hangi türü kullanmam gerektiğini söyleyebilir misin ?
Bartłomiej Semańczyk

Yeterince açıklığa kavuşturmamış olabilirim, sorma şekliniz kişisel tercihlerle ilgili, çözülecek gerçek bir sorun yok. Bire çok ilişkileri kullanmanın herhangi bir yolunu arıyorsanız, denedikleriniz ve nerede sorun yaşadığınızla ilgili bilgileri ekleyin. Bahsettiğiniz çözümlerin her birini anlıyorsanız ve en verimli olanı arıyorsanız - verimlilik kriterlerinizi listeleyin ve kullanım durumlarını açıklayın. Herhangi bir nedenle farklı türden ilişkileri anlamakta güçlük çekiyorsanız veya ilişkileri hiç kullanmak istemiyorsanız - doğrudan söyleyin.
Canlı

Soruyu güncelledim
Bartłomiej Semańczyk

Şimdi bu doğru bir soru, sizin için bir MagicalRecord etiketi ekledim, maalesef bu alanda deneyimli değilim ve umarım bu noktadan sonra size daha iyi yardımcı olabilecek biri.
A-Canlı

Yanıtlar:


181

Tamam, biraz araştırma ve test yaptım. Dönüştürülebilir tip kullanarak çözüm basittir:

1. NSManagedObject sınıfımın içinde ne beyan ederim?

@NSManaged var values: [NSNumber]  //[Double] also works

2. .xcdatamodel'imin içinde ne beyan ederim?

Transformable veri tipi.

3. Bunu Varlığıma nasıl kaydederim?

statistics!.values = [23, 45, 567.8, 123, 0, 0] //just this

"Dönüştürülebilir bir öznitelik olarak bir NSArray veya bir NSDictionary depolayabilirsiniz. Bu “bir NSData öznitelik dizi veya sözlüğünü seri hale getirmek için NSCoding kullanmak (ve uygun erişim üzerine bu serisini) olacak - Kaynak

Veya bunu İkili Veri olarak ilan etmek istiyorsanız, şu basit makaleyi okuyun :


İyi iş, cevap, tamamlanma uğruna yeşil bir onay işaretine değer gibi görünüyor.
Canlı

3
Ayrıca [NSString]bir dizi
Daisy R.

Çekirdek verilerden getirilirken yüklem eklemek mümkün müdür?
Satyam

5
Benim durumumda bir Dizeler dizisi kullanmaya çalışıyorum ve işe yaramıyor
allemattio

bunu hızlı 3 şekilde nasıl yaparsınız?
Martian2049

98

Swift 3 Swift 3'ten itibaren uygulama dosyalarına artık sahip olmadığımız için, yapmamız gereken şey xcdatamodeld dosyasına gitmek, varlığı ve istenen niteliği seçmek (bu örnekte buna değerler denir). Dönüştürülebilir ve özel sınıfı olarak ayarlayın [Double]. Şimdi onu normal bir dizi olarak kullanın.

Double dizisine özel sınıf ayarlama


Özel sınıfı [[Dize: Herhangi]] olarak tanımlamak mümkün mü? Bir dizi sözlük
BergP

Teorik olarak kabul edilebilir olmalı, ancak ben hiç denemedim.
Hola Soy Edu Feliz Navidad

2
Codegen'i her zaman Manual / None olarak ayarlayabilir ve kendi Core Data model sınıfınızı yazabilirsiniz.
Şematik

14

Diziyi NSData'ya Dönüştür

let appDelegate =
    UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let entity =  NSEntityDescription.entityForName("Device",
                                                inManagedObjectContext:managedContext)
let device = NSManagedObject(entity: entity!,
                             insertIntoManagedObjectContext: managedContext)
let data = NSKeyedArchiver.archivedDataWithRootObject(Array)

device.setValue(data, forKey: "dataOfArray")
do {
    try managedContext.save()
    devices.append(device)
} catch let error as NSError  {
    print("Could not save \(error), \(error.userInfo)")
}

İkili Verileri Seçin

NSData'yı Diziye Dönüştür

let appDelegate =
    UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Device")

do {
    let results =
        try managedContext.executeFetchRequest(fetchRequest)

    if results.count != 0 {

        for result in results {

                let data = result.valueForKey("dataOfArray") as! NSData
                let unarchiveObject = NSKeyedUnarchiver.unarchiveObjectWithData(data)
                let arrayObject = unarchiveObject as AnyObject! as! [[String: String]]
                Array = arrayObject
        }

    }

} catch let error as NSError {
    print("Could not fetch \(error), \(error.userInfo)")
}

Örneğin: https://github.com/kkvinokk/Event-Tracker


1
NSData'yı kullanmak gerçekten daha mantıklı ve daha basit.
GeneCode

2
Bu özelliğe bir yüklem eklemek istiyorsanız, çalışmayabilir.
Satyam

6

Basit tutuyor ve bir diziyi dizge olarak saklıyorsanız

Bunu dene:

// Array of Strings
let array: [String] = ["red", "green", "blue"]
let arrayAsString: String = array.description
let stringAsData = arrayAsString.data(using: String.Encoding.utf16)
let arrayBack: [String] = try! JSONDecoder().decode([String].self, from: stringAsData!)

Diğer veri türleri için sırasıyla:

// Set of Doubles
let set: Set<Double> = [1, 2.0, 3]
let setAsString: String = set.description
let setStringAsData = setAsString.data(using: String.Encoding.utf16)
let setBack: Set<Double> = try! JSONDecoder().decode(Set<Double>.self, from: setStringAsData!)

Çözümünüz zamandan tasarruf etti
Kishore Kumar

Neden olduğundan emin değilim, ancak bu çözümlerin hiçbiri benim için çalışmıyor. Dize dizisinin verilerini Core Data'da saklama ve geri alma çözümünüzü daha sonra bir dizge dizisine çözmeyi denedim, ancak hala çalışmıyor. Herhangi bir tavsiye?
Tyler Cheek

3

Varlık özellik türünü "İkili Veri" olarak yapın

NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:TheArray];
myEntity.arrayProperty = arrayData;
[self saveContext]; //Self if we are in the model class

Orijinal diziyi şu şekilde geri alın:

NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:anEntity.arrayProperty];

Bu kadar.


1

Aşağıdaki kod, JSON dizisini CoreData'da depolamak için benim için çalışıyor

func saveLocation(model: [HomeModel],id: String){

    let newUser = NSEntityDescription.insertNewObject(forEntityName: "HomeLocationModel", into: context)

    do{
        var dictArray = [[String: Any]]()
        for i in 0..<model.count{
            let dict = model[i].dictionaryRepresentation()
            dictArray.append(dict)
        }
        let data = NSKeyedArchiver.archivedData(withRootObject: dictArray)
        newUser.setValue(data, forKey: "locations")
        newUser.setValue(id, forKey: "id")
        try context.save()
    }catch {
       print("failure")
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.