【问题标题】:Unable to save/retrieve data from core data store in swift无法快速从核心数据存储中保存/检索数据
【发布时间】:2018-09-25 09:05:58
【问题描述】:

我正在尝试制作一个简单的应用程序来存储和检索用户数据。

有一个 RegisterViewController.swift,其中包含用户输入注册的字段(名称、登录用户名、登录密码、照片)。

我有一个 User.swift 类将这些信息保存在一个对象中

使用 CoreData,我设置了具有 4 个字段作为属性的“用户”实体。

我参考了以下链接来保存和检索用户表中的数据。
https://medium.com/xcblog/core-data-with-swift-4-for-beginners-1fc067cca707https://www.bobthedeveloper.io/blog/beginner-guide-to-core-data-in-swift

但是,我在调试时没有看到任何数据被保存或检索。我也没有看到任何异常。

下面是sn-p代码

let name = self.name.text;
let loginUsername = self.loginUsername.text;
let loginPassword = self.loginPassword.text;
let photo = self.photo.image;

print("Setting user data in the User object");
user = User(name: name!, loginUsername: loginUsername!, loginPassword: loginPassword!, photo: photo)!;

print("store data in DB")
//Setup delegate and context 
let appDelegate = UIApplication.shared.delegate as! AppDelegate;
let context = appDelegate.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "Users", in: context);
let newUser = NSManagedObject(entity: entity!, insertInto: context)

//Set values for the attributes        
newUser.setValue(name, forKey: "name")
newUser.setValue(loginUsername, forKey: "loginUsername")
newUser.setValue(loginPassword, forKey: "loginPassword")
//TODO: store the photo

//Save data         
do {
    print("Trying to same")
    try context.save()
 } catch {
    print("Failed to save user")
    let nserror = error as NSError
    fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
 }

 //Method 1: to get Users after saving       
 do {
     usersSaved = try context.fetch(Users.fetchRequest())
 } catch {
     print("Failed to fetch users")
     let nserror = error as NSError
     fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
 }

 //Method 2: to get Users after saving
 var usersSaved: [Users] = []
 let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users");
 request.returnsObjectsAsFaults = false
 do {
    let result = try context.fetch(request)
     print("Trying to fetch")
     for data in result as! [NSManagedObject] {
         print(data.value(forKey: "name") as! String)
     }
  } catch {
    print("Failed")
  }

这是我的 User.swift 类

class User {

    //MARK: Properties
    var name: String;
    var loginUsername: String;
    var loginPassword: String;
    var photo: UIImage? = nil;

    //MARK: Initialization
    init?(name: String, loginUsername: String, loginPassword: String, photo: UIImage?) {

        //Initialization should fail if there is no name or username or password
        if (name.isEmpty || loginUsername.isEmpty || loginPassword.isEmpty) {
            return nil;
        }

        //Initialize stored properties
        self.name = name;
        self.loginUsername = loginUsername;
        self.loginPassword = loginPassword;
        self.photo = photo;
     }
}

我已经在网上寻找答案,但无法弄清楚。任何指示或建议都会真正帮助我进步..

【问题讨论】:

  • 如果您使用 Core Data 为您创建的 Users NSManagedObject 类,您的代码会简单得多。你得到什么输出?你有没有抛出任何错误?在您的第一个提取代码中,您不会对获得的数据做任何事情。
  • 你也有太多了!不要养成使用强制展开和强制向下转换的习惯,只是为了让编译器满意。使用条件展开和条件向下转换来编写更可靠的代码
  • @Paulw11,感谢您的回复。正如您所建议的,我正在使用 Core Data 的用户对象。 User.swift 只是为了看看我是否可以将数据存储为对象。我没有收到任何消息或错误。没错,我没有对数据做任何事情,只是通过检查 SQLite 文件并使用调试器,我没有看到任何返回或存储的数据。要不要我改一下代码试试?
  • 但是您没有使用User 对象。您正在从 NSentity 而不是 User 从您的上下文创建一个 NSManagedObject。您也正在使用 setValue 而不是使用 User 属性。您的代码非常过时。我不知道作者为什么在现代教程中使用这种风格
  • @Paulw11,是的,我首先关注了这些文章。您能否指出正确的文章或使用 CoreData 的方法,而不是我所拥有的?

标签: ios swift core-data


【解决方案1】:

我正在为可能面临此问题的人回答我自己的问题。谢谢@Paulw11 的建议。 Xcode 的行为很奇怪,我不得不在 CoreData 实体得到解析之前执行 Project -> Clean 多次并删除 DerivedData 文件夹。

这就是我所做的

func storeUserData() {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate;
    let context = appDelegate.persistentContainer.viewContext

    //store data
    let newUser = Users(context: context);
    newUser.name = self.name.text;
    newUser.loginUsername = self.loginUsername.text;
    newUser.loginPassword = self.loginPassword.text;

    appDelegate.saveContext();

    //retrieve data
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users");
    request.returnsObjectsAsFaults = false
    do {
        print("Fetching from DB")
        let result = try context.fetch(request)
        //printing data
        for data in result as! [NSManagedObject] {
            print(data.value(forKey: "name") as! String)
            print(data.value(forKey: "loginUsername") as! String)
            print(data.value(forKey: "loginPassword") as! String)
        }
    } catch {
        print("Failed to fetch")
        let nserror = error as NSError
        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多