Làm thế nào để lưu Array vào CoreData?


93

Tôi cần lưu mảng của mình vào Dữ liệu cốt lõi.

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

Các giá trị bên trong mảng đó và số lượng giá trị có thể thay đổi.

1. Tôi phải khai báo gì bên trong lớp NSManagedObject của mình?

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. Tôi phải khai báo gì bên trong .xcdatamodel của mình?

nhập mô tả hình ảnh ở đây

3. Làm cách nào để lưu thông tin này vào Đối tượng của tôi? (Tôi sử dụng MagicalRecord)

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

Không có "nên", thiết kế DB là tùy thuộc vào bạn, ví dụ: theo như tôi lo, bạn cũng có thể sử dụng ngày tháng hoặc định dạng văn bản nếu đây được chứng minh là cách hiệu quả nhất để lưu trữ dữ liệu này trong ứng dụng của bạn.
A-Live

Vì vậy, bên trong của tôi NSManagedObject: @NSManaged var values: [Double]nó có tốt không? Bạn có thể cho tôi biết tôi nên sử dụng loại nào .xcdatamodelđể lưu cái này không?
Bartłomiej Semańczyk

Tôi có thể đã không nói đủ rõ ràng, cách bạn hỏi nó là về sở thích cá nhân, không có vấn đề thực sự để giải quyết. Nếu bạn đang tìm kiếm bất kỳ cách nào để sử dụng quan hệ một-nhiều, hãy thêm thông tin về những gì bạn đã thử và nơi bạn gặp sự cố. Nếu bạn hiểu từng giải pháp mà mình đề cập và đang tìm giải pháp hiệu quả nhất - hãy liệt kê các tiêu chí về hiệu quả và mô tả các trường hợp sử dụng. Nếu vì lý do nào đó mà bạn gặp khó khăn khi hiểu các loại quan hệ khác nhau hoặc không muốn sử dụng quan hệ - hãy nói thẳng.
A-Live

Tôi đã cập nhật câu hỏi
Bartłomiej Semańczyk

Bây giờ đó là một câu hỏi hay, tôi đã thêm thẻ MagicalRecord cho bạn, rất tiếc là tôi chưa có kinh nghiệm trong lĩnh vực này và hy vọng ai đó sẽ có thể giúp bạn tốt hơn từ thời điểm này.
A-Live

Câu trả lời:


179

Ok, tôi đã thực hiện một số nghiên cứu và thử nghiệm. Sử dụng loại Transformable , giải pháp rất đơn giản:

1. Tôi phải khai báo gì bên trong lớp NSManagedObject của mình?

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

2. Tôi phải khai báo gì bên trong .xcdatamodel của mình?

Transformable loại dữ liệu.

3. Làm cách nào để lưu thông tin này vào Đối tượng của tôi?

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

“Bạn có thể lưu trữ một NSArray hoặc NSDictionary như một thuộc tính có thể chuyển đổi. Điều này sẽ sử dụng NSCoding để tuần tự hóa mảng hoặc từ điển thành thuộc tính NSData (và giải mã hóa nó một cách thích hợp khi truy cập) ”- Nguồn

Hoặc Nếu bạn muốn khai báo nó là Dữ liệu nhị phân thì hãy đọc bài viết đơn giản này :


Làm tốt lắm, câu trả lời có vẻ đáng được đánh dấu màu xanh lá cây để hoàn thành.
A-Live

3
Cũng hoạt động với [NSString]một mảng các chuỗi
Daisy R.

Có thể thêm vị từ trong khi tìm nạp từ dữ liệu cốt lõi không?
Satyam

5
Trong trường hợp của tôi, tôi đang cố gắng sử dụng một mảng của Strings và nó không hoạt động
allemattio

làm thế nào bạn sẽ làm điều này trong cách nhanh chóng 3?
Martian2049

97

Swift 3 Vì chúng ta không có tệp triển khai nữa kể từ Swift 3, những gì chúng ta phải làm là truy cập tệp xcdatamodeld, chọn thực thể và thuộc tính mong muốn (trong ví dụ này, nó được gọi là giá trị). Đặt nó là có thể biến đổi và lớp tùy chỉnh của nó thành [Double]. Bây giờ sử dụng nó như một mảng bình thường.

Đặt lớp tùy chỉnh thành mảng Double


Có thể định nghĩa lớp tùy chỉnh là [[Chuỗi: Bất kỳ]] không? Một loạt các từ điển
BergP

Về mặt lý thuyết thì có thể chấp nhận được, tuy nhiên tôi chưa bao giờ thử.
Hola Soy Edu Feliz Navidad

2
Bạn luôn có thể đặt codegen thành Thủ công / Không có và viết lớp mô hình Dữ liệu lõi của riêng bạn.
Schemetrical

14

Chuyển đổi mảng sang 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)")
}

Chọn dữ liệu nhị phân

Chuyển đổi NSData thành Mảng

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

Ví dụ: https://github.com/kkvinokk/Event-Tracker


1
Sử dụng NSData thực sự có ý nghĩa hơn và đơn giản hơn.
GeneCode

2
Nếu bạn muốn thêm một vị từ vào thuộc tính đó, nó có thể không hoạt động.
Satyam

6

Nếu giữ nó đơn giản và lưu trữ một mảng dưới dạng chuỗi

Thử đi:

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

Đối với các kiểu dữ liệu khác tương ứng:

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

Giải pháp của bạn đã tiết kiệm rất nhiều thời gian của tôi
Kishore Kumar

Tôi không chắc tại sao, nhưng không có giải pháp nào trong số này hiệu quả với tôi. Tôi đã thử giải pháp của bạn là lưu trữ dữ liệu của mảng chuỗi trong Dữ liệu lõi và truy xuất nó, sau đó giải mã nó thành mảng chuỗi sau đó, nhưng nó vẫn không hoạt động. Có lời khuyên nào không?
Tyler Cheek

3

Đặt loại thuộc tính thực thể là "Dữ liệu nhị phân"

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

Lấy lại mảng ban đầu dưới dạng:

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

Đó là tất cả.


1

Mã sau hoạt động để tôi lưu trữ mảng JSON trong CoreData

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.