核心数据 - 无法获取,没有先插入
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
【讨论】:
以上是关于核心数据 - 无法获取,没有先插入的主要内容,如果未能解决你的问题,请参考以下文章