【问题标题】:Swift 2.1 - Pre-populating some data only once at first run (Core Data)Swift 2.1 - 首次运行时仅预填充一些数据(核心数据)
【发布时间】:2016-07-16 10:11:34
【问题描述】:

我有一小部分数据需要在用户首次启动应用时预先填充。我查看了其他选项,例如将应用程序与现有 sqlite 文件或 csv/json 捆绑在一起,但由于需要预加载的数据只有一个数据模型的 4 条记录,例如 var categories = [category1, category2, category3, category4],我觉得如果我对此进行硬编码会更有效率。

但是我怎样才能确保这个插入调用在第一次运行时只执行一次呢?

【问题讨论】:

    标签: swift core-data ios9


    【解决方案1】:

    我为我的应用预加载数据,并采用以下两种方式之一处理:

    • NSUserDefaults 中设置一个位,表明您已完成导入,然后在启动时检查(例如,这也可以扩展以允许在新版本上轻松更新文件)。
    • 获取给定实体的对象数量,如果 > 0 什么都不做(因为已经导入)。

    【讨论】:

    • 谢谢。我已经使用 Core Data 设置了 Category 实体,并且允许用户添加他们自己的类别以及默认的 4 个类别,因此如果可能的话,我正在寻找 Core Data 用例。
    【解决方案2】:

    您可以搜索一个实体,如果该实体返回 0 个结果,您可以使用初始信息填充它。

    var managedContext: NSManagedObjectContext!
    let dataFetch = NSFetchRequest(entityName: "Data")
    
    var result:[MyData]?
    do {
        result = try managedContext.executeFetchRequest(dataFetch) as? [MyData]
    } catch {
        print("Error fetching data")
    }
    
    if let data = result {
        if data.count == 0 {
            //create your data and save it
        }
    }
    

    【讨论】:

    • 谢谢。你会把这段代码放在哪里?我不知道我是否想要创建/更新功能的这一部分,因为我想避免每次用户执行创建/更新时都检查它。
    【解决方案3】:

    这可能来得太晚了,您可能已经修复了它,但我不久前遇到了这个问题。

    您可以在 AppDelegate 中设置如下内容:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
        let defaults = UserDefaults.standard
        let isPreloaded = defaults.bool(forKey: "isPreloaded")
        if !isPreloaded {
            preloadData()
            defaults.set(true, forKey: "isPreloaded")
        }
    
        return true
    }
    

    这样,您的应用每次都会检查它是否已经预加载了数据,如果已经预加载,它将跳过它。这是假设您已经设置了某种类型的 preloadData 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      相关资源
      最近更新 更多