存储的数据无法在表视图中显示,在一对多的核心数据关系中? [英] Data stored fails to display in the table view, in one to many relationship of core data?

查看:138
本文介绍了存储的数据无法在表视图中显示,在一对多的核心数据关系中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用核心数据制作一对多关系,其中我的应用程序的方案是显示受尊敬的团队的成员。团队和成员都是动态添加的。

I used core data to make a one to many relationship where the scenario of my application is to display the members for the respected team. Both teams and members are added dynamically.

在成员部分存储数据时出现此问题。数据正在存储,但不会显示在表视图中。我会收到此错误。

The issue occurs while storing the data at the member part. The data is getting stored but it won't get displayed in the table view. where I get this error.

data:{
memberDesignation =;
memberImage = nil;
memberName = bbgbb;
teams = nil;
})返回nil值为节名称键路径'Teams.teams'。对象将被放在未命名的部分

我做了一个愚蠢的错误,因为我是新的核心数据。我不能弄清楚我做错了什么。我会展示我做了什么,纠正我错了什么。请操纵我的代码,给我答案,没有逻辑或随机的答案。我没有足够的时间来尝试每一种可能性。帮助非常感谢,提前。

I have done even a silly mistake as I'm new to core data. I can't figure it out what I'm doing wrong. I will show what I have done, rectify me what I did wrong. Please manipulate my code and give me the answer, no logical or random answers 'coz I don't have enough time to try out every possibilities.Help is very much appreciated, thanks in advance.

ER模型

小组表视图控制器

import UIKit
import CoreData

class GroupTable: UITableViewController, NSFetchedResultsControllerDelegate {

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

var teamData = [Teams]()

var fetchedResultsController : NSFetchedResultsController = NSFetchedResultsController()

let statusbarHeight: CGFloat = 20


override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.contentInset.top = statusbarHeight
    self.navigationItem.leftBarButtonItem!.image = UIImage(named: "Arrow")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)

}

@IBAction func backToLogo(sender: AnyObject) {

    let previous = self.storyboard?.instantiateViewControllerWithIdentifier("Logo")
    self.presentViewController(previous!, animated: true, completion: nil)
}

override func viewWillAppear(animated: Bool) {

    let request = NSFetchRequest(entityName: "Teams")

    do{
        teamData = try managedObjectContext.executeFetchRequest(request) as! [Teams]
    } catch let error as NSError {
        print("\(error), \(error.userInfo)")
    }

    self.tableView.reloadData()

}


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if teamData.count > 0{

        self.tableView.backgroundView = nil
        return teamData.count

    } else {
        let emptyLabel = UILabel(frame: CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height))
        emptyLabel.text = "No Teams available at the moment, create one!"
        emptyLabel.textAlignment = NSTextAlignment.Center
        self.tableView.backgroundView = emptyLabel
        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        return 0

    }

}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("groupCell", forIndexPath: indexPath) 

    let teamDetails = teamData[indexPath.row]

    cell.textLabel?.text = teamDetails.teamName
    cell.imageView?.image = teamDetails.teamImage as? UIImage
    return cell

}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
    if segue.identifier == "memberView" {
        let destination = segue.destinationViewController as! MemberTableViewController
        let indexPath = tableView.indexPathForSelectedRow!
        let selectedObject = fetchedResultsController.objectAtIndexPath(indexPath) as! Teams
        destination.currentTeam = selectedObject            
    }
  }  
}


$ b b

会员表视图控制器

import UIKit
import CoreData


class MemberTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

var memberData = [Members]()

var currentTeam : Teams?

var fetchedResultsController: NSFetchedResultsController!

override func viewDidLoad() {
    super.viewDidLoad()

}

override func viewWillAppear(animated: Bool) {

    let request = NSFetchRequest(entityName: "Members")
    let members = NSSortDescriptor(key: "memberName", ascending: false)
    request.sortDescriptors = [members]
    if let thisTeam = currentTeam {

    request.predicate = NSPredicate(format:"teams == %@",thisTeam)
    }

    let fetchedResults = NSFetchedResultsController(fetchRequest: request, managedObjectContext: managedObjectContext, sectionNameKeyPath: "Teams.members", cacheName: nil)
    fetchedResults.delegate = self

    do {
        try fetchedResults.performFetch()
    } catch {
        fatalError("Failed to initialize FetchedResultsController: \(error)")
    }
    self.tableView.reloadData()

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows

    if memberData.count > 0{

        self.tableView.backgroundView = nil
        return memberData.count

    } else {
        let emptyLabel = UILabel(frame: CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height))
        emptyLabel.text = "No Members in the team, add one!"
        emptyLabel.textAlignment = NSTextAlignment.Center
        self.tableView.backgroundView = emptyLabel
        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        return 0

    }

}



override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("memberCell", forIndexPath: indexPath) as! ScreenThreeTableViewCell

    // Configure the cell...

    let memberDetails = memberData[indexPath.row]

    cell.memberName?.text = memberDetails.memberName
    cell.memberDesignation?.text = memberDetails.memberDesignation
    cell.memberImage?.image = memberDetails.memberImage as? UIImage

    return cell
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {


}

/*
// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    // Return false if you do not want the specified item to be editable.
    return true
}
*/

/*
// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    } else if editingStyle == .Insert {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }    
}
*/

/*
// Override to support rearranging the table view.
override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {

}
*/

/*
// Override to support conditional rearranging of the table view.
override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    // Return false if you do not want the item to be re-orderable.
    return true
}
*/


// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.      
  }
}

添加团队 / p>

To Add teams

import UIKit
import CoreData

class ScreenTwoPopOverViewController: UIViewController, UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIPopoverControllerDelegate {

@IBOutlet weak var teamNamePO: UITextField!
@IBOutlet weak var teamImagePO: UIImageView!
@IBOutlet weak var selectPicturePO: UIButton!


var picker:UIImagePickerController?=UIImagePickerController()
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
@IBAction func submit(sender: AnyObject) {

    let entity = NSEntityDescription.entityForName("Teams", inManagedObjectContext: managedObjectContext)
    let team = Teams(entity: entity!, insertIntoManagedObjectContext: managedObjectContext)

    team.teamName = teamNamePO.text
    team.teamImage = teamImagePO.image

    do{
        try managedObjectContext.save()
    } catch let error as NSError{
        print("\(error), \(error.userInfo)")
    }

    dismissViewControllerAnimated(true, completion: nil)

}
@IBAction func cancel(sender: AnyObject) {

    dismissViewControllerAnimated(true, completion: nil)
}

@IBAction func btnImagePickerClicked(sender: AnyObject)
{
    let alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

    let cameraAction = UIAlertAction(title: "Camera", style: UIAlertActionStyle.Default)
        {
            UIAlertAction in
            self.openCamera()

    }
    let gallaryAction = UIAlertAction(title: "Gallary", style: UIAlertActionStyle.Default)
        {
            UIAlertAction in
            self.openGallary()
    }
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel)
        {
            UIAlertAction in

    }

    // Add the actions
    picker?.delegate = self
    alert.addAction(cameraAction)
    alert.addAction(gallaryAction)
    alert.addAction(cancelAction)
    // Present the controller
    self.presentViewController(alert, animated: true, completion: nil)
}

func openCamera()
{
    if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera))
    {
        picker!.sourceType = UIImagePickerControllerSourceType.Camera
        self .presentViewController(picker!, animated: true, completion: nil)
    }else {
        openGallary()
    }
}

func openGallary()
{
    picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    self.presentViewController(picker!, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
{
    picker .dismissViewControllerAnimated(true, completion: nil)
    teamImagePO.image=info[UIImagePickerControllerOriginalImage] as? UIImage
}

func imagePickerControllerDidCancel(picker: UIImagePickerController)
{
    print("picker cancel.")
    self.presentViewController(self, animated: true, completion: nil)
}



/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/

}

strong>添加成员

To add members

import UIKit
import CoreData

class ScreenThreePopOverViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIPopoverControllerDelegate {

@IBOutlet weak var memberDesignationPO: UITextField!
@IBOutlet weak var memberNamePO: UITextField!
@IBOutlet weak var memberImagePO: UIImageView!

var picker:UIImagePickerController?=UIImagePickerController()
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

var currentTeam : Teams?


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
@IBAction func selectPicture(sender: AnyObject) {

    let alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

    let cameraAction = UIAlertAction(title: "Camera", style: UIAlertActionStyle.Default)
        {
            UIAlertAction in
            self.openCamera()

    }
    let gallaryAction = UIAlertAction(title: "Gallary", style: UIAlertActionStyle.Default)
        {
            UIAlertAction in
            self.openGallary()
    }
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel)
        {
            UIAlertAction in

    }

    // Add the actions
    picker?.delegate = self
    alert.addAction(cameraAction)
    alert.addAction(gallaryAction)
    alert.addAction(cancelAction)
    // Present the controller
    self.presentViewController(alert, animated: true, completion: nil)
}

func openCamera()
{
    if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera))
    {
        picker!.sourceType = UIImagePickerControllerSourceType.Camera
        self .presentViewController(picker!, animated: true, completion: nil)
    }else {
        openGallary()
    }
}

func openGallary()
{
    picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    self.presentViewController(picker!, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
{
    picker .dismissViewControllerAnimated(true, completion: nil)
    memberImagePO.image=info[UIImagePickerControllerOriginalImage] as? UIImage
}

func imagePickerControllerDidCancel(picker: UIImagePickerController)
{
    print("picker cancel.")
            dismissViewControllerAnimated(true, completion: nil)
}


@IBAction func cancel(sender: AnyObject) {

    dismissViewControllerAnimated(true, completion: nil)

}
@IBAction func submit(sender: AnyObject) {

    let entity = NSEntityDescription.entityForName("Members", inManagedObjectContext: managedObjectContext)
    let member = Members(entity: entity!, insertIntoManagedObjectContext: managedObjectContext)

    member.memberName = memberNamePO.text
    member.memberDesignation = memberDesignationPO.text
    member.memberImage = memberImagePO.image

if let team  = currentTeam {
        member.teams = team
    }        
    do{
        try managedObjectContext.save()
    } catch let error as NSError{
        print("\(error), \(error.userInfo)")
    }
    dismissViewControllerAnimated(true, completion: nil)


}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/

}

strong>小组实体

Team entity

extension Teams {

@NSManaged var teamImage: NSObject?
@NSManaged var teamName: String?
@NSManaged var members: NSSet?

}

会员实体 >

Members entity

extension Members {

@NSManaged var memberDesignation: String?
@NSManaged var memberImage: NSObject?
@NSManaged var memberName: String?
@NSManaged var teams: Teams?

}



我非常困惑,如何添加成员相对于球队?我怎么可以解决这个?为了更好地了解场景,您可以参考此问题我可以只使用Interface Builder和Core Data将NSManagedObject添加到选定的父对象吗?,还可以参考这个 https://github.com/pbasdf/DemoMasterDetail 这是我想让我的应用程序产生的输出。

I'm very much confused at, how to add the members with respect to the teams?! How could i resolve this? For a better understanding about the scenario you could refer to this question Can I add an NSManagedObject to the selected parent object just using Interface Builder and Core Data? and also you could refer to this https://github.com/pbasdf/DemoMasterDetail which is exactly how I would like my app to produce the output.

推荐答案

Hi Praveen Kumar你可以这样做:)

Hi Praveen Kumar you can do something like this :)

@IBAction func submit(sender: AnyObject) {

    let entity = NSEntityDescription.entityForName("Members", inManagedObjectContext: managedObjectContext)
    let member = Members(entity: entity!, insertIntoManagedObjectContext: managedObjectContext)

    member.memberName = memberNamePO.text
    member.memberDesignation = memberDesignationPO.text
    member.memberImage = memberImagePO.image

     member.setValue(currentTeam, forKey: "teams") //mistake you did is you were trying to set the wrong relationship :) member has a relationship to teams and is called teams. So you can access member.teams not member.members 

    //or
    member.teams = currentTeam

    do{
        try managedObjectContext.save()
    } catch let error as NSError{
        print("\(error), \(error.userInfo)")
    }
    dismissViewControllerAnimated(true, completion: nil)


}

>

TIP

关系船名应清楚地解释两个实体之间的链接。而只是简单地命名成员&团队会做出明智的名称:)

Relation ship names should clearly explain the link between two entities. Rather then giving simply names like members & teams make a much sensible names :)

团队 - >包含 - >会员
会员 - > Belongs_To - >团队

Teams -> contains -> Members Members -> Belongs_To -> Teams

所以团队实体应该有一对多关系发送给名为Contains的成员。所以当看到它并读取它将是队包含成员:​​)

So Team entity should have one to many relation ship to Members with name Contains. So when one sees it and reads it will be Team contains members :)

同样成员实体应该有一个到一个关系船到名称为Belongs_To的团队。所以当一个人看到它,读它将是成员属于团队:)

Similarly Members entity should have one to one relation ship to Teams with name Belongs_To. So when one sees it and reads it will be member belongs to Team :)

希望我的回答帮助了你:)

Hope my answer helped you :)

这篇关于存储的数据无法在表视图中显示,在一对多的核心数据关系中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆