0117iosapp_使用coredata数据实现搜索,保存,获取,删除,并且在列表中显示

项目loginCoreData0116

viewcontroller ,登录  数据搜索

//
//  ViewController.swift
//  loginCoreData0116
//
//  Created by Mac on 1/16/19.
//  Copyright © 2019 wjb. All rights reserved.
//

import UIKit
//引入coredata
import CoreData

class ViewController: UIViewController {
    
//初始化数据数组,接收登录账号数据的搜索结果
    var user_array : [Users] = []
    
    @IBOutlet weak var username_input: UITextField!
    @IBOutlet weak var userpwd_input: UITextField!
    
    @IBAction func login_button(_ sender: UIButton) {
        //检测账号是否存在:1,账号不存在,显示账号不存在;2,账号存在,跳转到列表页
        //建立类的代理
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        //建立数据存储对象
        let user_context = appDelegate.persistentContainer.viewContext
        
        
        
        //检测输入框内必须有内容
        if username_input.text != "" && userpwd_input.text != ""  {//两个输入框内容不为空为真
            
            //创建提取
            let user_date_fetchRequest = NSFetchRequest<Users>(entityName: "Users")
            //设置提取条件,按照用户名搜索,以下实现了单个条件
            user_date_fetchRequest.predicate = NSPredicate(format: "user_name = %@", username_input.text!)
            //暂时不知道如何设置多个条件
            
            
            do{
                //提取数据,赋值给数组
                user_array = try user_context.fetch(user_date_fetchRequest)
                //检测对象是否存在
                if user_array.count > 0 {//数组数据大于0为真
                    //跳转到列表页,绑定对应链接即可跳转
                    performSegue(withIdentifier: "main_to_third_link", sender: self)
                }else{
                    //提示用户名不存在
                    msg_show_lable.text = "用户名不存在"
                    
                }
                
                
            }catch{
                
            }
            
            
        }else{
            //提示数据不能为空
            msg_show_lable.text = "请输入数据"
            
        }
        
        
        
        
    }
    
    
    @IBOutlet weak var msg_show_lable: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }


}

secondReginViewController  注册,数据保存

//
//  secondReginViewController.swift
//  loginCoreData0116
//
//  Created by Mac on 1/16/19.
//  Copyright © 2019 wjb. All rights reserved.
//

import UIKit
//引入coredata
import CoreData

class secondReginViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    @IBOutlet weak var username_input: UITextField!
    
    @IBOutlet weak var userpwd_input: UITextField!
    
    
    @IBAction func regin_button(_ sender: UIButton) {
        //保存注册信息
        //创建代理
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        //创建容器
        let user_date_context = appDelegate.persistentContainer.viewContext
        //创建数据对象实例化
        let user_date = Users(context: user_date_context)
        
        //检测数据
        if username_input.text != "" && userpwd_input.text != "" {//数据不为空
            //创建数据内容
            user_date.user_name = username_input.text
            user_date.user_pwd = userpwd_input.text
            
            do{
                //容器的数据执行保存
                try user_date_context.save()
                //绑定跳转链接
                performSegue(withIdentifier: "second_to_third_link", sender: self)
                
            } catch {
                //提示错误信息
                msg_show_lable.text = "注册失败"
            }
            
        }else{
            //提示错误信息
            msg_show_lable.text = "数据不能为空"
        }
        
        
    }
    
    
    @IBOutlet weak var msg_show_lable: UILabel!
    
    
    /*
    // MARK: - Navigation

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

}

thirdListViewController  列表 数据显示,数据删除,表格更新

//
//  thirdListViewController.swift
//  loginCoreData0116
//
//  Created by Mac on 1/16/19.
//  Copyright © 2019 wjb. All rights reserved.
//

import UIKit
//引入coredata
import CoreData


//继承类增加UITableViewDelegate,UITableViewDataSource
class thirdListViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
    @IBOutlet weak var show_table_view: UITableView!
    
    @IBOutlet weak var msg_label: UILabel!
    //创建空数组变量保存提取的数据
    var user_date_array : [Users] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //表格和view链接,实现了在视图中的绑定操作
        show_table_view.delegate = self
        show_table_view.dataSource = self
        
        //提取数据
        //创建AppDelegate文件的 本类代理,coredate的操作方法在这个文件里,建立本类的代理后就可以使用了
        let appDelegate_as = UIApplication.shared.delegate as! AppDelegate
        //创建持久容器,存放从coredata中获取的数据,在这里操作数据
        let context_show = appDelegate_as.persistentContainer.viewContext
        //创建提取申请变量
        let user_fetchRequest = NSFetchRequest<Users>(entityName: "Users")
        //do方法执行提取
        do {
            //提取数据,保存到数组
            user_date_array = try context_show.fetch(user_fetchRequest)
            for userone in user_date_array {
                print(userone.user_name! + "---" + userone.user_pwd!)
                
            }
            /*
            //清空数据中的可能存在的nil,目前不知道为什么会出现nil数据
            for (index_u,user) in user_date_array.enumerated() {
                if user.user_name == nil {
                    user_date_array.remove(at: index_u)
                }
            }
            */
        } catch  {
            //提取失败
            msg_label.text = "数据获取失败"
        }
        

    }
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //返回数组的个数
        return user_date_array.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "Cell")
        
        cell.textLabel?.text = "name:\(user_date_array[indexPath.row].user_name!),pwd:\(user_date_array[indexPath.row].user_pwd!)"
        
        return cell
    }
    
    //设置删除动作
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        
        //检测是否是删除动作
        if editingStyle == UITableViewCell.EditingStyle.delete {
        //删除数据库中的对应数据
            //创建AppDelegate文件的 本类代理,coredate的操作方法在这个文件里,建立本类的代理后就可以使用了
            let appDelegate_as = UIApplication.shared.delegate as! AppDelegate
            //创建持久容器,存放从coredata中获取的数据,在这里操作数据
            let context_delete = appDelegate_as.persistentContainer.viewContext
            //执行删除
            context_delete.delete(user_date_array[indexPath.row])
            //保存数据
            do{
                try context_delete.save()
            }catch{
                //删除失败
                msg_label.text = "删除失败"
            }
      //重新获取数据
            //创建提取申请变量
            let user_fetchRequest = NSFetchRequest<Users>(entityName: "Users")
            //do方法执行提取
            do {
                //提取数据,保存到数组
                user_date_array = try context_delete.fetch(user_fetchRequest)
            } catch  {
                //提取失败
                msg_label.text = "数据获取失败"
            }
            
            
     //表格重载
            show_table_view.reloadData()
            
        }
        
    }
    
    

    
}

/*
 //创建AppDelegate文件的 本类代理,coredate的操作方法在这个文件里,建立本类的代理后就可以使用了
 let appDelegate_as = UIApplication.shared.delegate as! AppDelegate
 //创建持久容器,存放从coredata中获取的数据,在这里操作数据
 let context_delete = appDelegate_as.persistentContainer.viewContext
 可以在类中创建,这样多个方法可以使用,不用重复创建
 手机模拟器中的coredata 数据会影响测试,可以换一个型号模拟
 表格中的数据操作后一定要重新获取数据后再重载,不然会报错
 还是不知道多个条件如何搜索
 
 
 */

猜你喜欢

转载自blog.csdn.net/whqwjb/article/details/86519882