TableController不显示Core-data中的数据

时间:2015-08-12 03:11:47

标签: ios swift uitableview core-data

我想通过使用core-data和tableView来练习CoreData来进行简单的联系。 所以我看了youtube并写了它的代码。 最后,我认为我得到了这个,我自己制作,但是tableView不包含任何数据,我可以编译。谁能告诉我有什么问题?并希望告诉我如何检查核心数据中存储的数据?

import UIKit
import CoreData

class ViewController: UIViewController {

var context = (UIApplication.sharedApplication().delegate as!AppDelegate).managedObjectContext

var stores : Contact? = nil

@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var phoneTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    if  stores != nil {

        nameTextField.text = stores?.name
        phoneTextField.text = stores?.phone
        context?.save(nil)
    }   }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

@IBAction func saveTapped(sender: AnyObject) {
    let context = self.context
    // Get the description of the entity
    if stores != nil { let storeDescription = NSEntityDescription.entityForName("stores", inManagedObjectContext: context!)
        // Then, We Create the Managed Object to be  inserted into the cored data
        stores = Contact(entity: storeDescription!, insertIntoManagedObjectContext: context)
    }
    // set the attributes
    stores?.name = nameTextField.text
    stores?.phone = phoneTextField.text

    context!.save(nil) // Save The object

    let alert = UIAlertView(title: "저장 완료", message: "\(nameTextField.text)님이 전화번호부에 저장 되었습니다", delegate: nil, cancelButtonTitle: "OK")
    alert.show()


}

}

这是我的tableviewcontroller。

import UIKit
import CoreData

class TableViewController: UITableViewController , NSFetchedResultsControllerDelegate{

let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var frc : NSFetchedResultsController = NSFetchedResultsController()
var stores = [Contact]()
override func viewDidLoad() {
    super.viewDidLoad()

    frc.delegate = self
    frc.performFetch(nil)

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
override func viewWillAppear(animated: Bool) {
    var error:NSError?

    let request = NSFetchRequest(entityName: "Contact")

    stores  = context?.executeFetchRequest(request, error: &error) as! [Contact]

    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 Potentially incomplete method implementation.
    // Return the number of sections.
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.
    return stores.count
}


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

    // Configure the cell...



    let save = stores[indexPath.row]
    cell.textLabel!.text = save.name
    cell.detailTextLabel!.text = save.phone

    return cell
}

func getFetchedResultsController() ->NSFetchedResultsController {

    frc = NSFetchedResultsController(fetchRequest: listFetchRequest(), managedObjectContext: context!, sectionNameKeyPath: nil, cacheName: nil)
    return frc

}
func listFetchRequest() -> NSFetchRequest {
    let fetchRequest = NSFetchRequest(entityName: "Contact")
    let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]
    return fetchRequest
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 == "edit"
    {
        let destViewController = segue.destinationViewController as! ViewController

        let indexPath = self.tableView.indexPathForSelectedRow()
        let row = indexPath?.row

        destViewController.stores = stores[row!]

    }


}
}

更新----因为我修复了我的viewController,它有效。这就像

 import UIKit
    import CoreData

    class ViewController: UIViewController {

var context = (UIApplication.sharedApplication().delegate as!AppDelegate).managedObjectContext

var stores : Contact? = nil

@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var phoneTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    if  stores != nil {

        nameTextField.text = stores?.name
        phoneTextField.text = stores?.phone
        context?.save(nil)
    }   }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

@IBAction func saveTapped(sender: AnyObject) {

    if stores != nil {
        edit()
    }else {
        addNew()
    }

    navigationController?.popViewControllerAnimated(true)
    }



func addNew() {
    let description = NSEntityDescription.entityForName("Contact", inManagedObjectContext: context!)
    let stores = Contact(entity: description!, insertIntoManagedObjectContext: context)
    stores.name = nameTextField.text
    stores.phone = phoneTextField.text
    context?.save(nil)

}
func edit() {
    stores!.name = nameTextField.text
    stores!.phone = phoneTextField.text
    context?.save(nil)

}

}

1 个答案:

答案 0 :(得分:0)

<强> 1。如何查找和查看SQLlite文件。

您可以使用以下函数找到.sqlite文件的路径。

 func applicationDirectoryPath() -> String { 
   return    NSSearchPathForDirectoriesInDomains(.DocumentDirectory,  .UserDomainMask, true).last! as! String
}

然后使用任何第三方工具查看Sqlite数据库的内容,如SQLLite Manager(firefox插件)

<强> 2。在TableView中显示数据。

在tableViewController中,而不是使用stores变量使用NSFetchedResultController(frc)来检索并显示TableView中的数据。查看此link以了解如何使用带有TableViewController的NSFetchedResultController。