核心数据 - 无法获取,没有先插入

Posted

技术标签:

【中文标题】核心数据 - 无法获取,没有先插入【英文标题】:Core Data - can't fetch, without first inserting 【发布时间】:2016-11-30 11:41:55 【问题描述】:

我已将数据模型和核心数据添加到现有项目中,并且我可以成功编写对象并保存/插入,但我不能只获取数据库中的内容。我究竟做错了什么?还是我误解了 Core Data 的工作原理?

我可以插入一个对象,然后使用下面的代码获得所需的结果 - 但如果不先使用插入,我将无法检索对象。我想存储一个“令牌”,以便应用记住它。

let dc = DataController()
let moc = dc.managedObjectContext

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Token")
//fetchRequest.returnsObjectsAsFaults = false

do 
    let entities = try moc.fetch(fetchRequest) as! [NSManagedObject]
    print(entities.count) // prints 0
    print(entities) // prints []
    for entity in entities 
        print(entities.count) // these dont work because of 0 results
        print(entity) // these dont work because of 0 results
    
 catch 
    print("could not fetch")

调试日志:

0
[]
CoreData: annotation: Connecting to sqlite database file at "/Users/xxxx/Library/Developer/CoreSimulator/Devices/1231231-123123-123123-123123-123123123/data/Containers/Data/Application/123123-123123-123123-123123-123123123/Documents/DataModel.sqlite"
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: pragma recursive_triggers=1
CoreData: sql: pragma journal_mode=wal
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE'
CoreData: annotation: Disconnecting from sqlite database.

我已经打开了 sqlite 文件,我之前插入的对象存在那里。

【问题讨论】:

为什么你认为你可以从空数据库中获取数据? 【参考方案1】:

您可以这样做来检索数据。

func retriveSaveData()

    let request:NSFetchRequest<TestData> = TestData.fetchRequest()
    do 
        let data = try managedObjectcontext.fetch(request) as [TestData]

        if let str = data.first?.name
            // Your retrieve data
            print(str)
        
    catch
        let error  = error as NSError
        print("\(error)")
    

用于保存和更新数据。

 func saveToDataBase(data:[TestData])
        for data1 in data

            let request:NSFetchRequest<TestData> = TestData.fetchRequest()
            do 
                let count = try managedObjectcontext.count(for: request)
                if count == 0 
                    // save data according to your requirement.
                    print(data1)
                else

                    //if anything you want to update then wright here
                

            catch
                let error  = error as NSError
                print("\(error)")
            
        
    

希望对你有帮助

【讨论】:

我进一步添加更新和保存数据。【参考方案2】:

既然您知道要在持久存储中搜索的实体,请确保 NSFetchRequest(现在是 Swift 3 中的泛型)是一个 Token 对象:

let fetchRequest = NSFetchRequest<Token>(entityName: "Token")

你也可以将它作为一个令牌项目:

let entities = try moc.fetch(fetchRequest) as! Token

【讨论】:

以上是关于核心数据 - 无法获取,没有先插入的主要内容,如果未能解决你的问题,请参考以下文章

在通过核心数据获取数据的同时,自动再次插入已有的行

如何获取核心数据来保存/获取我的文件?

我似乎无法从 MySQL 获取最后插入的记录/ID

核心数据需要时间来插入具有获取实体的记录并设置为关系

核心数据获取...为啥在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象?

在 Objective C 中从 XML 中获取核心数据