- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 CoreData
,但我已经完成了我的项目的设置,忘记勾选使用它的复选框。
如果先前在设置过程中未选中 CoreData
框,是否有一种方法可以实现核心数据的使用?
如果我开始一个新项目,将不得不传输大量信息,这会很耗时,所以我想留在同一个项目上,而不是创建一个新项目。
最佳答案
坦率地说,您没有在创建项目时选中 Use CoreData
框,这是正确的想法。我觉得用一堆更容易(也更有洞察力)手动完成的东西只会使项目膨胀。
简而言之,无论您在创建项目时选择了什么选项,您都可以实现相同的 CoreData。
以下是我想向我的项目添加 CoreData 支持(手动/编程)时通常要执行的步骤:
这些只是 NSManagedObjects
代表您的应用程序的数据结构。比如User
,Message
,BlogPost
等。我也做了一个用于我的用户设置。
例子:
import CoreData
class User : NSManagedObject
{
// @NSManaged is the replacement for @dynamic when using CoreData in Swift
@NSManaged var identifier : String
@NSManaged var firstName : String?
@NSManaged var lastName : String?
// This is called when a new User object is inserted to CoreData
override func awakeFromInsert()
{
super.awakeFromInsert()
self.identifier = NSUUID().UUIDString // generate a random unique ID
}
}
这是您通过以下方式添加到项目中的另一个文件:File -> New-> iOS-> CoreData -> Data Model。我通常将这个相同的 xcmodeldata
文件存储在我的 Models
项目文件夹中(连同我的实际模型类)。
选择这个新文件后,您将看到 CoreData 模型编辑器。您会希望看到右侧的检查器 Pane 可见(热键是 ⌥⌘1)。对于核心数据编辑器,您还将主要使用第三个选项卡(数据模型检查器),它可以通过 ⌥⌘3 切换。
现在您可以向该数据模型添加一个实体对象(通过底部的添加实体)。假设上面的例子,添加一个 User
实体。选择 User
实体后,添加在上述类中定义的三个属性:identifier
、firstName
、和 lastName
。它们应该匹配类定义,使用 String
类型。
下一步是告诉 CoreData 这里定义的这个 User
实体映射到我们实际的类文件。选择 User
并打开数据模型检查器 Pane ,将 Name 设置为 User
并将 Class 设置为 你的 AppName.User
.
这是 Swift 和 CoreData 的“陷阱”,您的类以模块名称为前缀,以便为它们命名(避免名称冲突)。好的部分是您不再需要为您的对象添加“XYZ”类前缀。
定义数据模型后,您需要初始化 CoreData 堆栈本身(数据库存储和上下文)。最基本的示例是您的 NSManagedObjectContext
的全局单例,它将在需要时延迟加载。
你可以把它放在它自己的 Swift 文件中(CoreDataStack.swift
):
import CoreData
let managedObjectContext : NSManagedObjectContext =
{
// This is your xcdatamodeld file
let modelURL = NSBundle.mainBundle().URLForResource("MyApp", withExtension: "momd")
let dataModel = NSManagedObjectModel(contentsOfURL: modelURL!)
// This is where you are storing your SQLite database file
let documentsDirectory : NSURL! = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).last as? NSURL
let storeURL = documentsDirectory.URLByAppendingPathComponent("MyApp.sqlite")
let psc = NSPersistentStoreCoordinator(managedObjectModel: dataModel!)
var error : NSError?
let store = psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error)
if let error = error
{
println("Uhoh, something happened! \(error), \(error.userInfo)")
}
let context = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
context.persistentStoreCoordinator = psc
context.undoManager = nil
return context
}()
现在您有了一个可用的 Core Data 堆栈,定义和映射了一些数据模型……下一步是什么?
让我们获取一些对象!
func getUsersByFirstName(firstName: String) -> [User]
{
let fetchRequest = NSFetchRequest(entityName: "User")
// The [c] part indicates case-insensitive, "Bob" == "bob"
fetchRequest.predicate = NSPredicate(format: "firstName ==[c] %@", firstName)
var error : NSError?
let results = context.executeFetchRequest(fetchRequest, error: &error) as [User]
// Handle errors here
return results
}
哦,对了,我们没有什么可取的。您还可以插入对象...
func insertNewUser() -> User
{
return NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context) as User
}
当然你可以删除对象...
func deleteUser(user: User)
{
context.deleteObject(user)
}
关键是要记住 CoreData 上下文 (NSManagedObjectContext
) 跟踪内存中的变化。虽然您可以在上下文中执行这些 CRUD 操作并立即查看更改(在同一上下文中),但在您保存更改之前它们不会持久存在数据库中:
func saveContext() -> Bool
{
var error : NSError?
if context.hasChanges && !context.save(&error)
{
println("Something happened when saving! \(error!), \(error!.userInfo)")
return false
}
return true
}
您还可以使用 context.rollback()
回滚上次保存的更改。
随意探索 CoreData 并尝试更高级的功能,例如谓词 (NSPredicate
)、排序描述符 (NSSortDescriptor
) 和设置对象关系。
关于xcode - 核心数据问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29109313/
我正在观看来自 iTunes U. 的视频讲座,其中讲师展示了如何使用 Xcode 的调试器部分并能够将该窗口从主窗口拉开。 不幸的是,视频显示了如何在 Xcode3 中执行此操作的说明。如何在 Xc
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
我真的厌倦了其他用户的项目错误,因为 XCode 的默认类引用类型是“相对于 XCode 文件夹”。我知道您可以将其更改为“相对于封闭组”,这就是我们的项目,但是任何时候有人创建一个新的类文件并且忘记
我对 Xcode 一无所知,除了它是来自 Apple 的开发人员界面,它实际上来自 OSX CD,它也用于创建 iPhone 应用程序。 我也知道它有一个 Applications 文件夹,里面装满了
更新 Xcode(从 7.2 到 7.2.1)后,XcodeServer 无法运行 Xcode Service。当我选择更新的 Xcode 时,提示消息:Enable Accessibility ac
我很难找到有关新 XCode 布局的信息。如何查看源文件的反汇编,而不仅仅是 C++ 代码? 最佳答案 在 Xcode 4.2(和 Xcode 5)中,您可以通过以下方式查看文件的汇编或反汇编: 显示
我在 XCode 中为我的项目添加了一个文件夹并将其命名为 Themes,它将用于存储我的 iPad 应用程序的主题。在那下面我有红色、蓝色等等。 它们出现在 XCode 中。但是当我查看物理文件夹时
作为我之前 How can I create a reference cycle using dispatchQueues? 的后续: 对于强引用(会造成泄漏,但不是循环引用),例如Timer、Dis
我有一台 macbook air,我去商店安装 Xcode 7.3 并点击更新 App 按钮,然后出现了一个加载图标,但等待 30 分钟后什么也没发生。我从商店成功安装了 simple recorde
我的项目现在有一个project.xcworkspace/xcshareddata目录。 Xcode在project.xcworkspace/xcshareddata目录中存储什么? 最佳答案 xcs
我不经常使用 XCode 进行开发,最近 MacPorts 告诉我我需要获得 3.1 才能使包工作。我去了苹果,他们为我提供了最新版本,结果只适用于 OSX 6。因为我有 OSX 5,它对我没有任何帮
有谁知道如何强制 Xcode 停止运行。我更新到 6.2 但现在它不能正常工作。我需要退出 Xcode 才能完成更新或卸载并重新安装。菜单中的相当 Xcode 不可用。无法将其拖到垃圾箱,因为它说它仍
我最近从我的项目中删除了一些旧的测试类并删除了文件。正如预期的那样,文件被移到垃圾箱并在 git 中显示为已删除。 不幸的是,测试类和它们定义的测试用例继续出现在测试导航器中。我已经尝试过常见的疑点,
Xcode 中的场景编辑器显示大小但不显示单位。它是以英寸为单位的尺寸还是以米为单位的尺寸? 例如,当我选择一个节点时,例如一个盒子,当我在节点检查器中检查它的属性并在“边界框”旁边的“变换”部分检查
只想知道 xcode 项目中事件可执行文件的目的是什么? 谢谢 索拉布 最佳答案 自己找到了..希望它会帮助某人。 您可以在其中运行和测试软件产品的可执行环境。可执行环境定义了应该用来运行产品的程序。
刚回到我的办公 table ,Xcode 一直在文件中突出显示/强调空白区域。如果我输入一些东西它就会消失,但如果我切换标签并回来,它们会重新出现。 更新:这不是由“显示隐形”选项引起的。那看起来不一
我首先注意到这一点 Cmd-/偶尔拒绝为注释取消注释的代码行工作。但是现在(刚刚使用 XCode 4.1,虽然这可能无关)它发生在 Cmd-B建立。 我无法弄清楚我正在做什么导致这种情况,或者是否有任
我不太了解Xcode 4的工作区的实用程序。它们的用途是什么,它们如何帮助Xcode进行开发? 最佳答案 例如。您有一个在两个应用程序中使用的库。您很可能为此库拥有一个自己的项目,对吗?现在,您可以自
我正在关注一个应用程序教程,它说: “接下来,在 Xcode 应用程序项目目录的根目录下创建一个空文件,并调用该文件 Podfile。使用您喜欢的文本编辑器打开它,然后在其中粘贴以下行:” 我很困惑这
我是一名优秀的程序员,十分优秀!