ios - TableController不显示来自Core-data的数据

标签 ios swift uitableview core-data

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

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。如何查找和查看 SQLlite 文件。

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

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

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

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

在 tableViewController 中,不要使用存储变量,而是使用 NSFetchedResultController (frc) 来检索并显示 TableView 中的数据。看看这个link用于将 NSFetchedResultController 与 TableViewController 一起使用。

关于ios - TableController不显示来自Core-data的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955401/

相关文章:

ios - 不正确的行为 git 子模块

swift - 忽略标志指针 0x10ef76ec0 : no flag found at that address in Xcode 的 RegisterValidateFunction()

ios - Swift - 在没有谈话时停止语音识别

ios - 使用 "Equal width"约束时如何获取 UIView 的宽度或高度

ios - 如何在 UITableView Cell 中实现类似 iOS Mail 的从左向右滑动

iphone SDK 4分组TableViewCell顶部双边框

ios - UI相关初始化代码UITableViewCell with Storyboard的最佳位置

ios - 稍后调用 tableView cellForRowAtIndexPath

ios - Swift 2.0 迁移代码错误

ios - C# 规范是否允许从 ulong 转换为 int? Monotouch 给出一个 NumberOverflow