简体   繁体   中英

How to save a JSON array to Realm in Swift?

JSONData after format:

(title: "delectus aut autem", completed: false)
(title: "delectus aut autem", completed: true)
(title: "delectus aut autem", completed: true)
(title: "delectus aut autem", completed: false)

My Struct:

struct TodoListResponse: Decodable {
    let title: String
    var completed: Bool
}

Realm DataModel

class TodoIItemList: Object {
    @objc dynamic var title: String = ""
    @objc dynamic var completed: Bool = false
}

ParseJson Data and by didUpdateData() delegate function sending Data to ViewController

func parseJSON(toDoListData: Data)  {
    let decoder = JSONDecoder()
    do {
        let jsonData = try decoder.decode([TodoListResponse].self, from: toDoListData)
        self.delegate?.didUpdateData(jsonData)
    } catch{
        delegate?.didFailWithError(error: error)
    }
}

In my viewcontroller , didUpdateData() I want to save my array to Realm but i am failed. How can i save data here.

import UIKit
import RealmSwift
   class ViewController: UIViewController {
    
    let realm = try! Realm()
    var todoLists: Results<TodoIItemList>?

    
    @IBOutlet weak var todoListTable: UITableView!
    var dataManager = DataManager()
    var listArray = [TodoListResponse]()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        dataManager.delegate = self
        dataManager.fetchTodoListInformation()
        
        //MARK: - call UITableView
        setupTableView()
    }
    
    
    //MARK: - Setup or Register UITableView
    func setupTableView() {
        todoListTable.dataSource = self
        todoListTable.register(UINib(nibName: K.cellNibName, bundle: nil), forCellReuseIdentifier: K.cellReuseIdentifier)
        //todoListTable.separatorStyle = .none
        todoListTable.contentInsetAdjustmentBehavior = .never
        todoListTable .reloadData()
    }
    
    func save(_ object: [Object]) {
        do{
            try realm.write{
                realm.add(object)
            }
        }catch{
            print(error)
        }
    }

Delegate Method:

//MARK: - TodoDataManagerDelegate
extension ViewController: TodoDataManagerDelegate{
    func didUpdateData(_ todoData: [TodoListResponse]) {
        listArray = todoData
        
        print("list: \(todoData)")
        DispatchQueue.main.async {
            //save(todoItem: listArray)
            self.todoListTable.reloadData()
        }
    }
    
}

Thanks in advance.

save(todoItem: listArray) doesn't work because save expects an [Object] , but listArray is a [TodoListResponse] .

What you are missing is the step that converts your codable struct TodoListResponse to the Realm model TodoIItemList . I would write the save method like this:

func save(_ todoListResponses: [TodoListResponse]) {
    do{
        try realm.write{
            for response in todoListResponses {
                let object = TodoIItemList()
                object.title = response.title
                object.completed = response.completed
                realm.add(object)
            }
        }
    }catch{
        print(error)
    }
}

Now save(todoItem: listArray) should work.

If there are many properties that needs to be set in TodoIItemList , you can move the "copying properties" logic to a convenience initialiser of TodoIItemList that initialises a TodoIItemList from a TodoListResponse .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM