2016-08-01 52 views
0

我試圖在JournalEntryVC.swift中添加與患者相關的不同日記條目。Realm-更新對象數組中的所有項目而不是僅添加新項目

我的病人類有軸頸的陣列條目即let journalEntries = List<Journal>()我的期刊類具有表示日記條目即屬性entryTypeentryDateentryCaption性質。

但是,當我在JournalEntryVC.swift中循環JSON時,我的附加日記帳分錄的屬性也被最近的日記帳分錄屬性替換,而不是僅將新日記帳分錄對象追加到日記帳分錄newPatient.journalEntries.append(myJournal)的數組中。

例如,newPatient.journalEntries[0]entryCaptionentryType具有相同的字符串值,如newPatient.journalEntries[1]等。

主要問題:關於如何添加新日記條目及其屬性但不更改之前附加日記條目的日記條目屬性的任何想法?

謝謝!

// Patient.swift 
 

 
import Foundation 
 
import RealmSwift 
 

 

 
class Patient: Object { 
 
    
 
    dynamic var patientName = "" 
 
    dynamic var patientAvatar = "" 
 
    dynamic var patientId = 0 
 
    dynamic var isDietitian = false 
 

 
//array of journal entries for each patient 
 
    let journalEntries = List<Journal>() 
 

 
    
 
    override class func primaryKey() -> String { 
 
     return "patientId" 
 
    } 
 
}

// Journal.swift 
 

 
import Foundation 
 
import RealmSwift 
 

 

 
class Journal: Object { 
 

 
    dynamic var entryId = "" 
 
    dynamic var entryType = "" 
 
    dynamic var entryImg = "" 
 
    dynamic var entryCaption = "" 
 
    dynamic var entryComment = "" 
 
    dynamic var entryCategory = "" 
 
    dynamic var entryDate = "" 
 
    
 
     
 
    override class func primaryKey() -> String { 
 
     return "entryId" 
 
    } 
 
    
 
}

//JournalEntryVC.swift 
 

 
import UIKit 
 
import Alamofire 
 
import BXProgressHUD 
 
import SwiftyJSON 
 
import RealmSwift 
 

 

 
class JournalEntryVC: UIViewController, UITableViewDelegate, UITableViewDataSource { 
 

 

 
    func reloadInitialData () { 
 
    
 
    //mutable arrays containing journal entry attributes 
 
    desc.removeAllObjects() 
 
    type.removeAllObjects() 
 
    category.removeAllObjects() 
 
    metric_stat.removeAllObjects() 
 
    entryImages.removeAllObjects() 
 
    dateCreate.removeAllObjects() 
 
    comments.removeAllObjects() 
 
    entryType.removeAllObjects() 
 
    id.removeAllObjects() 
 
    //comments.removeAllObjects() 
 
    content.removeAllObjects() 
 
    patName.removeAllObjects() 
 
    
 
    
 
    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
 
    dispatch_async(dispatch_get_global_queue(priority, 0)) { 
 
     let request = Alamofire.request(.GET, "https://gethealthie.com/entries.json", headers: [ 
 
      "access-token": userCreds.objectForKey("access-token")! as! String, 
 
      "client": userCreds.objectForKey("client")! as! String, 
 
      "token-type": userCreds.objectForKey("token-type")! as! String, 
 
      "uid": userCreds.objectForKey("uid")! as! String, 
 
      "expiry": userCreds.objectForKey("expiry")! as! String 
 
      ]).responseJSON { response in 
 
       
 
       print(response.response) 
 
       
 
       let json = JSON(data: response.data!) 
 
       
 
       
 
       if json.count == 0 { 
 
        BXProgressHUD.hideHUDForView(self.view); 
 
       }else { 
 
        
 
        //Realm- create object instances of Patient and Journal class 
 
        let newPatient = Patient() 
 
        let myJournal = Journal() 
 
        
 
        for i in 0 ..< json.count { 
 
         
 
         let entry = json[i] 
 
         print(entry) 
 
         
 
         let name = entry["entry_comments"] 
 
         let k = name["id"] 
 
         
 
         //add entry attributes to mutable arrays 
 
         self.type.addObject(entry["type"].stringValue) 
 
         self.desc.addObject(entry["description"].stringValue) 
 
         self.category.addObject(entry["category"].stringValue) 
 
         self.metric_stat.addObject(entry["metric_stat"].stringValue) 
 
         self.dateCreate.addObject(entry["created_at"].stringValue) 
 
         self.comments.addObject(entry["entry_comments"].rawValue) 
 
         self.entryType.addObject(entry["category"].stringValue) 
 
         let posterInfo = entry["poster"] 
 
         let first = posterInfo["first_name"].stringValue 
 
         let last = posterInfo["last_name"].stringValue 
 
         let full = first + " " + last 
 
         self.patName.addObject(full) 
 
         self.id.addObject(entry["id"].stringValue) 
 
         self.entryImages.addObject(entry["image_url"].stringValue) 
 
         
 
         
 
         //Realm- access properties in Journal class and set it equal to the current journal entry attribute i.e. json[i] 
 
         myJournal.entryType = entry["type"].stringValue 
 
         myJournal.entryCaption = entry["description"].stringValue 
 
         myJournal.entryCategory = entry["category"].stringValue 
 
         myJournal.metricStat = entry["metric_stat"].stringValue 
 
         myJournal.entryDate = entry["created_at"].stringValue 
 
         // myJournal.entryComment = entry["entry_comments"].rawValue as! String 
 
         
 
         //append a NEW journal entry to the array of journal entries in Patient class i.e. let journalEntries = List<Journal>() as the json loops thru different journal entries 
 
         newPatient.journalEntries.append(myJournal) 
 
         
 
         if i == json.count - 1 { 
 
          // do some task 
 
          dispatch_async(dispatch_get_main_queue()) { 
 
           self.tableView.reloadData() 
 
           BXProgressHUD.hideHUDForView(self.view) 
 
          } 
 
         } 
 
         
 
        } 
 
        
 
        //Realm- add newPatient object instance to realm 
 
        try! self.realm.write { 
 
         self.realm.add(newPatient) 
 
         
 
        } 
 
       } 
 
       
 
     } 
 
    } 
 
    } 
 

 
}

回答

1

你實例化一個實例Journal for循環外的Journal,更改該Journal的值,然後將其附加到患者的JournalEntries。嘗試在for循環中移動let myJournal = Journal()

+0

非常感謝您的幫助!我是Swift和Realm的新手,所以你推動我朝着正確的方向前進。另外,我注意到數據不會在啓動之間持續。根據Realm的文檔,你必須在一個寫事務中添加一個對象到一個Realm中,以便它能夠持久化,我相信我在上面做了。有沒有其他原因可能導致它在啓動之間不存在(即強制退出應用程序並再次啓動)? – mir

+0

這可能是因爲你在後臺線程中執行寫操作,但是使用'self.realm',我猜測它是在主線程上實例化的。你可以簡單地做一個'let realm = try! Realm()'並使用該對象在你的線程中進行寫操作。這裏詳細討論了這個問題:https://realm.io/docs/swift/latest/#threading – emb

+0

只是爲了澄清,即使在飛機模式下強制退出然後再次啓動後,我仍然試圖保留數據在飛機模式下(不確定這是否是有效的用例)。雖然數據持續存在,並且我可以在啓動應用程序(使用WiFi)並切換到飛行模式時使用領域對象來顯示它,但在我強制退出後(在飛行模式下)它似乎不會持續存在,並在飛機模式下再次啓動。我試圖讓「realm = try!」 Realm()'按照您的建議在我自己的主題中編寫,但似乎不適用於我的用例。 – mir

相關問題