Core data 清除核心数据swift 3中的空条目

Core data 清除核心数据swift 3中的空条目,core-data,swift3,xcode8,ios10,Core Data,Swift3,Xcode8,Ios10,我将向您展示我运行的模拟应用程序的图像: 我需要把上面的那些空条目处理掉。我将向您展示我的存储、清除和获取方法 存储: func createGetContext() -> NSManagedObjectContext{ let appDelegate = (UIApplication.shared.delegate as? AppDelegate) return (appDelegate?.persistentContainer.viewContex

我将向您展示我运行的模拟应用程序的图像:

我需要把上面的那些空条目处理掉。我将向您展示我的存储、清除和获取方法

存储:

func createGetContext() -> NSManagedObjectContext{

        let appDelegate = (UIApplication.shared.delegate as? AppDelegate)

         return (appDelegate?.persistentContainer.viewContext)!

    }

    private func createMessageWithText(text: String, friend: Friend, minutesAgo: Double, context: NSManagedObjectContext) {

        //setting up the message as a Message() type and filling in the parameters
        let message = NSEntityDescription.insertNewObject(forEntityName: "Message", into: context) as! Message
        message.friend = friend
        message.text = text
        message.date = NSDate().addingTimeInterval(-minutesAgo * 60)

    }

    //setting up the data
    func setupData(){

        clearData()
        //batchDelete()

        let context = createGetContext()

        let adagio = NSEntityDescription.insertNewObject(forEntityName: "Friend", into: context) as! Friend
        adagio.name = "Adagio"
        adagio.profileImageName = "photo_adagio"


        let glaive = NSEntityDescription.insertNewObject(forEntityName: "Friend", into: context) as! Friend
        glaive.name = "Glaive"
        glaive.profileImageName = "photo_glaive"

        let ringo = NSEntityDescription.insertNewObject(forEntityName: "Friend", into: context) as! Friend
        ringo.name = "Ringo"
        ringo.profileImageName = "photo_ringo"

        let celeste = NSEntityDescription.insertNewObject(forEntityName: "Friend", into: context) as! Friend
        celeste.name = "Celeste"
        celeste.profileImageName = "photo_celeste"

        createMessageWithText(text: "This is boredom at its best!", friend: adagio, minutesAgo: 2, context: context)
        createMessageWithText(text: "Somebody! get a soda.", friend: adagio, minutesAgo: 3, context: context)
        createMessageWithText(text: "Im going to cut you into little pieces.", friend: adagio, minutesAgo: 1, context: context)
        createMessageWithText(text: "Eat axe, bitch!!", friend: glaive, minutesAgo: 4, context: context)
        createMessageWithText(text: "Anybody wants to be my pingpong ball?!", friend: glaive, minutesAgo: 0, context: context)
        createMessageWithText(text: "Drunk right now!", friend: ringo, minutesAgo: 2, context: context)
        createMessageWithText(text: "Stars and Boom!", friend: celeste, minutesAgo: 6, context: context)

        do {
            try context.save()
            print("Saved!!!!!")
        } catch let err {
            print(err)
        }

        getMessages()

    }
清除方法(我尝试了2种):

func clearData(){
//创建一个获取请求,告诉它有关实体的信息
让fetchRequestMessage:NSFetchRequest=Message.fetchRequest()
让fetchRequestFriend:NSFetchRequest=Friend.fetchRequest()
做{
//运行获取请求并添加到数组。
friends=尝试createGetContext().fetch(fetchRequestFriend)作为[Friend]
为了朋友中的朋友{
//循环和删除
createGetContext().delete(朋友)
}
//获取结果并将其添加到要删除的数组中
messages=尝试createGetContext().fetch(fetchRequestMessage)作为[消息]
信息中的信息{
//循环遍历数组并删除每条消息
createGetContext().delete(消息)
}
//删除后必须保存上下文
尝试(createGetContext().save())
}抓住{
打印(“请求错误:\(错误)”)
}
}
//删除所有内容(错误:如果运行,则不会在tableView上显示任何内容)
private func batchDelete(){
让fetchRequestMessage:NSFetchRequest=Message.fetchRequest()
让fetchRequestFriend:NSFetchRequest=Friend.fetchRequest()
让requestFriend=NSBatchDeleteRequest(fetchRequest:fetchRequestFriend as!NSFetchRequest)
让requestMessage=NSBatchDeleteRequest(fetchRequest:fetchRequestMessage为!NSFetchRequest)
做{
尝试createGetContext().execute(requestFriend)
尝试createGetContext().execute(requestMessage)
}捉迷藏{
打印(错误)
}
}
以及获取方法:

//fetching the messages
    func getMessages () {

        if let friends = fetchFriends() {

            for friend in friends {
                print(friend.name!)


                //create a fetch request, telling it about the entity
                let fetchRequest: NSFetchRequest<Message> = Message.fetchRequest()
                //sort the array by time/date
                fetchRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)]
                //filtering the pull with friend's name equal to friend.name!
                fetchRequest.predicate = NSPredicate(format: "friend.name = %@", friend.name!)
                //limit pull to 1 item
                fetchRequest.fetchLimit = 1

                do {
                    //go get the results and add to array for display
                    let fetchedMessages = try createGetContext().fetch(fetchRequest) as [Message]
                    //appending the messages into the message array
                    messages?.append(contentsOf: fetchedMessages)

                } catch {
                    print("Error with request: \(error)")
                }
                //sorting the messages array...throwing a nil...need to fix
//                messages?.sort(by: { $0.date?.compare($1.date as! Date) == ComparisonResult.orderedAscending })

            }
        }


    }
//获取消息
func getMessages(){
如果let friends=fetchFriends(){
朋友中的朋友{
打印(朋友的名字!)
//创建一个获取请求,告诉它有关实体的信息
let fetchRequest:NSFetchRequest=Message.fetchRequest()
//按时间/日期对数组排序
fetchRequest.sortDescriptors=[NSSortDescriptor(键:“日期”,升序:false)]
//过滤好友名称等于friend.name的拉取!
fetchRequest.predicate=NSPredicate(格式:“friend.name=%@”,friend.name!)
//将拉力限制为1项
fetchRequest.fetchLimit=1
做{
//去获取结果并添加到数组中进行显示
让fetchedMessages=try createGetContext().fetch(fetchRequest)作为[消息]
//将消息追加到消息数组中
消息?.append(内容:fetchedMessages)
}抓住{
打印(“请求错误:\(错误)”)
}
//对消息数组进行排序…抛出零…需要修复
//邮件?.sort(按:{$0.date?.compare($1.date as!date)==ComparisonResult.orderedascensing})
}
}
}

我认为这些条目来自失败的测试。如您所见,我尝试清空实体,还尝试将它们拉入数组并逐个删除。都不管用。请帮帮我。:)或者至少帮助您找出如何不在阵列中添加这些元素,以便它们不会出现。提前谢谢

经过无数次测试后,我在viewDidLoad中运行了batchDelete()方法,而不是在setupData()方法中运行,该方法正好在batchDelete()之后运行,这很有效


这里的教训是,不要等待答案。在等待答案的时候,一定要努力通过

如果你只是想摆脱旧的测试数据,我的理解是,你可以简单地从设备/模拟器中删除应用程序。
//fetching the messages
    func getMessages () {

        if let friends = fetchFriends() {

            for friend in friends {
                print(friend.name!)


                //create a fetch request, telling it about the entity
                let fetchRequest: NSFetchRequest<Message> = Message.fetchRequest()
                //sort the array by time/date
                fetchRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)]
                //filtering the pull with friend's name equal to friend.name!
                fetchRequest.predicate = NSPredicate(format: "friend.name = %@", friend.name!)
                //limit pull to 1 item
                fetchRequest.fetchLimit = 1

                do {
                    //go get the results and add to array for display
                    let fetchedMessages = try createGetContext().fetch(fetchRequest) as [Message]
                    //appending the messages into the message array
                    messages?.append(contentsOf: fetchedMessages)

                } catch {
                    print("Error with request: \(error)")
                }
                //sorting the messages array...throwing a nil...need to fix
//                messages?.sort(by: { $0.date?.compare($1.date as! Date) == ComparisonResult.orderedAscending })

            }
        }


    }