কোরেডাটাতে অ্যারে কীভাবে সংরক্ষণ করবেন?


95

আমার অ্যারেটি কোর ডেটাতে সংরক্ষণ করতে হবে।

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

এই অ্যারের অভ্যন্তরের মানগুলি এবং মানগুলির সংখ্যা পরিবর্তনশীল।

আমার এনএস পরিচালিতঅবজেক্ট ক্লাসের মধ্যে আমি কী ঘোষণা করব?

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 এর ভিতরে আমি কী ঘোষণা করব?

এখানে চিত্র বর্ণনা লিখুন

৩. কীভাবে আমি আমার সত্তায় এটি সংরক্ষণ করব? (আমি ম্যাজিকাল রেকর্ড ব্যবহার করি)

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সংরক্ষণ করতে আমার কোন ধরণের ব্যবহার করা উচিত ?
বার্তোমিয়েজ সেমাসেকেক

আমি এটি যথেষ্ট পরিমাণে পরিষ্কার করে না দিয়েছি, আপনি এটি যেভাবে জিজ্ঞাসা করেছেন সেটি ব্যক্তিগত পছন্দ সম্পর্কে, সমাধান করার মতো কোনও আসল সমস্যা নেই। যদি আপনি একাধিক সম্পর্ক ব্যবহারের কোনও উপায় সন্ধান করে থাকেন তবে আপনি কী চেষ্টা করেছেন এবং কোথায় কোন সমস্যা হয়েছে সে সম্পর্কে তথ্য যুক্ত করুন। আপনি যদি উল্লিখিত সমাধানগুলির প্রতিটি বোঝেন এবং সর্বাধিক দক্ষ সমাধানের সন্ধান করছেন - আপনার দক্ষতার মানদণ্ডটি তালিকাভুক্ত করুন এবং ব্যবহারের ক্ষেত্রে বর্ণনা করুন। যদি কোনও কারণে আপনার বিভিন্ন ধরণের সম্পর্ক বুঝতে সমস্যা হয় বা সম্পর্কটি মোটেই ব্যবহার করতে চান না - সরাসরি বলুন।
এ-লাইভ

আমি প্রশ্নটি আপডেট করেছি
বার্তোমিয়েজ সেমাসেকেক

এখন এটি একটি শালীন প্রশ্ন, আমি আপনার জন্য একটি ম্যাজিকাল রেকর্ড ট্যাগ যুক্ত করেছি, দুর্ভাগ্যক্রমে আমি এই অঞ্চলে অভিজ্ঞ নই এবং আশা করি যে এই ব্যক্তিটি আপনাকে এই স্থান থেকে আরও ভালভাবে সহায়তা করতে সক্ষম হবে।
এ-লাইভ

উত্তর:


184

ঠিক আছে, আমি কিছু গবেষণা এবং পরীক্ষা করেছি। রূপান্তরযোগ্য ধরণের ব্যবহার করে সমাধানটি সহজ:

আমার এনএস পরিচালিতঅবজেক্ট ক্লাসের মধ্যে আমি কী ঘোষণা করব?

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

2. আমার .xcdatamodel এর ভিতরে আমি কী ঘোষণা করব?

Transformable তথ্য প্রকার।

৩. কীভাবে আমি আমার সত্তায় এটি সংরক্ষণ করব?

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

“আপনি একটি এনএসআরাই বা একটি এনএসডি অভিধানকে ট্রান্সফরমবল অ্যাট্রিবিউট হিসাবে সঞ্চয় করতে পারেন। এটি এনএসডাটা অ্যাট্রিবিউটের অ্যারে বা অভিধানকে সিরিয়ালাইজ করতে এনএসকোডিং ব্যবহার করবে (এবং অ্যাক্সেসের পরে এটিকে যথাযথভাবে ডিসরিয়ালাইজ করবে) "- উত্স

বা আপনি যদি এটি বাইনারি ডেটা হিসাবে ঘোষণা করতে চান তবে এই সাধারণ নিবন্ধটি পড়ুন :


ভাল কাজ, উত্তরটি সমাপ্তির জন্য সবুজ চেকমার্ক হিসাবে মূল্যবান বলে মনে হচ্ছে।
এ-লাইভ

4
এছাড়াও [NSString]স্ট্রিংগুলির অ্যারের জন্য কাজ করে
ডেইজি আর।

মূল ডেটা থেকে আনার সময় কি প্রাকটিকেট যুক্ত করা সম্ভব?
সত্যম

4
আমার ক্ষেত্রে আমি স্ট্রিংগুলির একটি অ্যারে ব্যবহার করার চেষ্টা করছি এবং এটি কাজ করে না
অলমেটিও 4'17 এ 14

আপনি দ্রুত 3 উপায়ে এটি কিভাবে করবেন?
মার্টিয়ান2049

104

সুইফট 3 যেহেতু আমাদের কাছে সুইফট 3 হিসাবে বাস্তবায়ন ফাইল নেই, তাই আমাদের যা করতে হবে তা এক্সসিডিটামোডেল্ড ফাইলে যাচ্ছে, সত্তা এবং পছন্দসই বৈশিষ্ট্যটি নির্বাচন করুন (উদাহরণস্বরূপ এটিকে মান বলা হয়)। এটিকে রূপান্তরযোগ্য এবং এর নিজস্ব কাস্টম হিসাবে সেট করুন [Double]। এখন এটি একটি সাধারণ অ্যারে হিসাবে ব্যবহার করুন।

ডাবল অ্যারে কাস্টম ক্লাস সেট করা


কাস্টম ক্লাসটি [[স্ট্রিং: যে কোনও]] হিসাবে সংজ্ঞায়িত করা সম্ভব?
অভিধানের

তাত্ত্বিকভাবে এটি গ্রহণযোগ্য হওয়া উচিত, তবে আমি কখনও চেষ্টা করি নি।
হোলা সোয় এদু ফেলিজ নাভিদাদ

4
আপনি সর্বদা ম্যানুয়াল / নাউইতে কোডজেন সেট করতে পারেন এবং নিজের কোর ডেটা মডেল ক্লাস লিখতে পারেন।
স্কিমেট্রিকাল

14

অ্যারেকে এনএসডিটাতে রূপান্তর করুন

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

বাইনারি ডেটা নির্বাচন করুন

এনএসডাটা অ্যারেতে রূপান্তর করুন

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


4
এনএসডাটা ব্যবহার প্রকৃতপক্ষে আরও জ্ঞান এবং সহজ করে তোলে।
জেনকোড

4
আপনি যদি সেই বৈশিষ্ট্যে কোনও শিকারী যুক্ত করতে চান তবে এটি কার্যকর নাও হতে পারে।
সত্যম

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

আপনার সমাধানটি আমার সময় সাশ্রয় করেছে
কিশোর কুমার

আমি নিশ্চিত না কেন, তবে এই সমাধানগুলির কোনওটিই আমার পক্ষে কাজ করছে না। আমি কোর ডেটাতে স্ট্রিং অ্যারের ডেটা সংরক্ষণ এবং এটি পুনরুদ্ধার করার জন্য আপনার সমাধানটি চেষ্টা করেছি, তারপরে এটি পরে স্ট্রিং অ্যারে ডিকোডিং করছি, তবে এটি এখনও কাজ করছে না। কোন পরামর্শ?
টাইলার গাল

এটি এটি করার একটি মোটামুটি অপরিশোধিত পদ্ধতি - ডেবিটি ডিবিতে সূচিযোগ্য হবে না কারণ এটি একটি বিএলওবি হিসাবে সংরক্ষণ করা হচ্ছে। ডেটা পড়া / লেখার ক্ষেত্রেও বেশ কিছুটা ওভারহেড রয়েছে - উদাহরণস্বরূপ, আপনি সহজেই পরিবর্তনগুলি সম্পাদনের জন্য সংগ্রহের কোনও পদ্ধতি ব্যবহার করতে পারবেন না। ট্রান্সফরমাল ব্যবহার করা পছন্দসই উপায়।
বনান্থানাম 510

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

নিম্নলিখিত কোডটি কোরেডাটাতে জেএসএনের অ্যারে সঞ্চয় করার জন্য আমার পক্ষে কাজ করে

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

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.