कोरडाटा के लिए ऐरे को कैसे बचाएं?


93

मुझे अपनी सरणी को कोर डेटा में सहेजने की आवश्यकता है।

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

उस सरणी के अंदर के मान और मानों की संख्या परिवर्तनशील है।

1. मैं अपने NSManagedObject वर्ग के अंदर क्या घोषित करता हूं?

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 के अंदर क्या घोषित करता हूं?

यहाँ छवि विवरण दर्ज करें

3. मैं अपनी इकाई में इसे कैसे बचा सकता हूं? (मैं MagicalRecord का उपयोग करता हूं)

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

कोई "नहीं" होना चाहिए, डीबी डिज़ाइन आपके ऊपर है, उदाहरण के लिए, जहां तक ​​मेरा संबंध है आप तिथियों या पाठ प्रारूप का उपयोग कर सकते हैं यदि यह आपके एप्लिकेशन पर इस डेटा को संग्रहीत करने का सबसे कारगर तरीका साबित होता है।
ए-लाइव

तो मेरे अंदर NSManagedObject: @NSManaged var values: [Double]यह अच्छा है? क्या आप मुझे बता सकते हैं कि मुझे .xcdatamodelइसे बचाने के लिए किस प्रकार का उपयोग करना चाहिए ?
बार्टोलोमिएज सेमेकोस्की

मैंने इसे पर्याप्त रूप से स्पष्ट नहीं किया है, जिस तरह से आप पूछते हैं कि यह व्यक्तिगत प्राथमिकता के बारे में है, हल करने के लिए कोई वास्तविक समस्या नहीं है। यदि आप एक-से-कई संबंधों का उपयोग करने के लिए किसी भी तरीके की तलाश कर रहे हैं, तो आपने जो कोशिश की है और जहां आपके पास एक मुद्दा है, उसकी जानकारी जोड़ें। यदि आप अपने द्वारा बताए गए प्रत्येक समाधान को समझते हैं और सबसे कुशल की तलाश कर रहे हैं - दक्षता के अपने मानदंडों को सूचीबद्ध करें और उपयोग के मामलों का वर्णन करें। यदि किसी कारण से आपको विभिन्न प्रकार के संबंधों को समझने में परेशानी हो रही है या संबंधों का उपयोग बिल्कुल नहीं करना चाहते हैं - तो सीधे कहें।
ए-लाइव

मैंने प्रश्न को अद्यतन किया
बार्टोलोमिएज सेमेकोज़ी

अब यह एक अच्छा सवाल है, मैंने आपके लिए एक MagicalRecord टैग जोड़ा है, दुर्भाग्य से मैं इस क्षेत्र में अनुभवी नहीं हूं और उम्मीद है कि कोई ऐसा व्यक्ति जो इस बिंदु से आपकी बेहतर मदद कर सकेगा।
A-Live

जवाबों:


179

ठीक है, मैंने कुछ शोध और परीक्षण किए। परिवर्तनीय प्रकार का उपयोग करना , समाधान सरल है:

1. मैं अपने NSManagedObject वर्ग के अंदर क्या घोषित करता हूं?

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

2. मैं अपने .xcdatamodel के अंदर क्या घोषित करता हूं?

Transformable डाटा प्रकार।

3. मैं अपनी इकाई में इसे कैसे बचा सकता हूं?

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

“आप एक NSArray या एक एनएसडीआर को एक परिवर्तनीय विशेषता के रूप में संग्रहीत कर सकते हैं। यह NSCata विशेषता के लिए सरणी या डिक्शनरी को क्रमबद्ध करने के लिए NSCoding का उपयोग करेगा (और उचित रूप से इसे एक्सेस करने पर deserialize करेगा) ”- Source

या यदि आप इसे बाइनरी डेटा घोषित करना चाहते हैं तो इस सरल लेख को पढ़ें :


अच्छा काम, जवाब पूरा होने के लिए एक हरे रंग की चेकमार्क के लायक लगता है।
A-Live

3
[NSString]स्ट्रिंग्स की एक सरणी के लिए भी काम करता है
डेज़ी आर।

क्या कोर डेटा से प्राप्त करते समय विधेय जोड़ना संभव है?
सत्यम

5
मेरे मामले में मैं स्ट्रिंग्स की एक सरणी का उपयोग करने की कोशिश कर रहा हूं और यह काम नहीं करता है
accmattio

आप इसे 3 तरह से कैसे करेंगे?
Martian2049

97

स्विफ्ट 3 जैसा कि हमारे पास अब स्विफ्ट 3 के रूप में कार्यान्वयन फ़ाइलें नहीं हैं, हमें जो करना है वह xcdatamodeld फ़ाइल में जा रहा है, इकाई और इच्छित विशेषता का चयन करें (इस उदाहरण में इसे मान कहा जाता है)। इसे परिवर्तनीय और इसके कस्टम वर्ग के रूप में सेट करें [Double]। अब इसे सामान्य सरणी के रूप में उपयोग करें।

डबल की सरणी के लिए कस्टम वर्ग की स्थापना


क्या कस्टम वर्ग को [[स्ट्रिंग: कोई भी]] के रूप में परिभाषित करना संभव है? शब्दकोशों की एक सरणी
BergP

सैद्धांतिक रूप से यह स्वीकार्य होना चाहिए, हालांकि मैंने कभी कोशिश नहीं की।
होला

2
आप कोडन को हमेशा मैन्युअल / कोई नहीं पर सेट कर सकते हैं और अपना स्वयं का कोर डेटा मॉडल वर्ग लिख सकते हैं।
स्कीमरिकल

14

कन्वर्ट Array को NSData में

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)")
}

बाइनरी डेटा का चयन करें

कन्वर्ट NSData Array के लिए

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)")
}

उदाहरण के लिए: https://github.com/kkvinokk/Event-Tracker


1
NSData का उपयोग वास्तव में अधिक समझदार और सरल बनाता है।
जिनेकोड

2
यदि आप उस विशेषता के लिए एक विधेय जोड़ना चाहते हैं, तो यह काम नहीं कर सकता है।
सत्यम

6

यदि इसे सरल रखते हुए और एक स्ट्रिंग को एक स्ट्रिंग के रूप में संग्रहीत करें

इसे इस्तेमाल करे:

// 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!)

क्रमशः अन्य डेटा प्रकारों के लिए:

// 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!)

आपके समाधान ने मेरा समय बहुत बचाया
किशोर कुमार

मुझे यकीन नहीं है कि क्यों, लेकिन इनमें से कोई भी समाधान मेरे लिए काम नहीं कर रहा है। मैंने कोर डेटा में स्ट्रिंग सरणी के डेटा को संग्रहीत करने और इसे पुनर्प्राप्त करने के आपके समाधान की कोशिश की, फिर इसे बाद में एक स्ट्रिंग सरणी में डिकोड किया, लेकिन यह अभी भी काम नहीं कर रहा है। कोई सुझाव?
टायलर चीक

3

इकाई विशेषता प्रकार को "बाइनरी डेटा" बनाएं

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

मूल सरणी को निम्न के रूप में पुनःप्राप्त करें:

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

बस इतना ही।


1

कोरडटा में JSON की सरणी स्टोर करने के लिए निम्नलिखित कोड मेरे लिए काम करता है

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")
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.