领域 - 将具有初始数据的文件添加到项目 (iOS/Swift)
Realm - Add file with initial data to project (iOS/Swift)
我正在使用 swift 为 iOS 开发一个应用程序,并选择 Realm 作为它的数据库解决方案。我使用领域文档中的 write/add 函数在 AppDelegate 中编写了默认数据,它工作得很好。所以在第一次启动后,我有一个包含我的初始数据的 *.realm 文件。在 Realm 文档中,我找到了一个名为 "Bundling a Realm with an App" 的部分,我将我的 *.realm 文件添加到项目中,并按其编写的方式添加到构建阶段。
而且我不明白我接下来应该做什么(以及关于压缩 *.realm 文件的部分)。我试图理解来自 Migration Example 的代码,但我不太了解 Obj-C。
请提供尽可能清晰的步骤,将带有初始数据的 *.realm 文件添加到 swift ios 项目,并在第一次启动时将此数据加载到 Realm 数据库。
在 AppDelegate 中实现此函数 openRealm
并在
中调用它
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
openRealm()
return true
}
func openRealm() {
let defaultRealmPath = Realm.defaultPath
let bundleReamPath = NSBundle.mainBundle().resourcePath?.stringByAppendingPathComponent("default.realm")
if !NSFileManager.defaultManager().fileExistsAtPath(defaultRealmPath) {
NSFileManager.defaultManager().copyItemAtPath(bundleReamPath!, toPath: defaultRealmPath, error: nil)
}
}
它会将您捆绑在应用程序中的领域文件复制到默认领域路径(如果尚不存在)。之后你就可以正常使用Realm了。
还有您在 Swift 中谈到的迁移示例。
在 Swift 3.0.1 中你可能更喜欢这个:
let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let bundleRealmPath = Bundle.main.url(forResource: "seeds", withExtension: "realm")
if !FileManager.default.fileExists(atPath: defaultRealmPath.absoluteString) {
do {
try FileManager.default.copyItem(at: bundleRealmPath!, to: defaultRealmPath)
} catch let error {
print("error copying seeds: \(error)")
}
}
(但请注意选项)
对于那些需要@pteofil 在 Objective-c
中回答的人
- (void)openRealm {
NSString *defaultRealmPath = [RLMRealm defaultRealm].path;
NSString *bundleRealmPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"default.realm"];
if(![[NSFileManager defaultManager] fileExistsAtPath:defaultRealmPath]) {
[[NSFileManager defaultManager] copyItemAtPath:bundleRealmPath toPath:defaultRealmPath error:nil];
}
}
正在为 Swift 2.2/Realm 1.0.2 更新@pteofil 的 openRealm 函数:
func openRealm() {
let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
let bundleReamPath = NSBundle.mainBundle().URLForResource("default", withExtension: "realm")
if !NSFileManager.defaultManager().fileExistsAtPath(defaultURL.path!) {
do {
try NSFileManager.defaultManager().copyItemAtURL(bundleReamPath!, toURL: defaultURL)
}
catch {}
}
}
Swift 版本 3,由 Kishikawa Katsumi:
提供
let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let bundleReamPath = Bundle.main.path(forResource: "default", ofType:"realm")
if !FileManager.default.fileExists(atPath: defaultRealmPath.path) {
do
{
try FileManager.default.copyItem(atPath: bundleReamPath!, toPath: defaultRealmPath.path)
}
catch let error as NSError {
// Catch fires here, with an NSError being thrown
print("error occurred, here are the details:\n \(error)")
}
}
在企业工作 space,我需要为每个应用程序打开一个 Realm,而不是在所有应用程序中重复使用 Realm,所以我将它放在一起用于 Swift 3.0。将此函数添加到 AppDelegate。
func openRealm()
{
let appName = "ApplcationNameGoesHere"
var rlmConfig = Realm.Configuration()
let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let appRealmPath = defaultRealmPath.deletingLastPathComponent().appendingPathComponent("\(appName).realm")
if !FileManager.default.fileExists(atPath: appRealmPath.path) {
// Use the default directory, but replace the filename with the application name: appName
rlmConfig.fileURL = rlmConfig.fileURL!.deletingLastPathComponent().appendingPathComponent("\(appName).realm")
}else
{
rlmConfig.fileURL = appRealmPath
}
// Set this as the configuration used for the default Realm
Realm.Configuration.defaultConfiguration = rlmConfig
}// open the Realm database for the application
以上代码根据本例中的 appName 变量打开或创建文件名为 "ApplicationNameGoesHere.realm" 的 Realm。
地方
openRealm() before return true in application: didFinishLaunchingWithOptions
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
openRealm()
return true
}
在另一个 class 中这样调用它:
let uiRealm = try! Realm()
如果您想直接从包位置打开它而不是将其复制到默认的 Realm 路径,请查看实现 here
在您的系统中下载 Realm Studio。然后从Xcode打印路径并复制:
print(Realm.Configuration.defaultConfiguration.fileURL!)
然后打开终端并写入:
open //file path
它将在 Realm Studio 中打开文件,您可以在那里看到您的模型数据。
我正在使用 swift 为 iOS 开发一个应用程序,并选择 Realm 作为它的数据库解决方案。我使用领域文档中的 write/add 函数在 AppDelegate 中编写了默认数据,它工作得很好。所以在第一次启动后,我有一个包含我的初始数据的 *.realm 文件。在 Realm 文档中,我找到了一个名为 "Bundling a Realm with an App" 的部分,我将我的 *.realm 文件添加到项目中,并按其编写的方式添加到构建阶段。
而且我不明白我接下来应该做什么(以及关于压缩 *.realm 文件的部分)。我试图理解来自 Migration Example 的代码,但我不太了解 Obj-C。
请提供尽可能清晰的步骤,将带有初始数据的 *.realm 文件添加到 swift ios 项目,并在第一次启动时将此数据加载到 Realm 数据库。
在 AppDelegate 中实现此函数 openRealm
并在
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
openRealm()
return true
}
func openRealm() {
let defaultRealmPath = Realm.defaultPath
let bundleReamPath = NSBundle.mainBundle().resourcePath?.stringByAppendingPathComponent("default.realm")
if !NSFileManager.defaultManager().fileExistsAtPath(defaultRealmPath) {
NSFileManager.defaultManager().copyItemAtPath(bundleReamPath!, toPath: defaultRealmPath, error: nil)
}
}
它会将您捆绑在应用程序中的领域文件复制到默认领域路径(如果尚不存在)。之后你就可以正常使用Realm了。
还有您在 Swift 中谈到的迁移示例。
在 Swift 3.0.1 中你可能更喜欢这个:
let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let bundleRealmPath = Bundle.main.url(forResource: "seeds", withExtension: "realm")
if !FileManager.default.fileExists(atPath: defaultRealmPath.absoluteString) {
do {
try FileManager.default.copyItem(at: bundleRealmPath!, to: defaultRealmPath)
} catch let error {
print("error copying seeds: \(error)")
}
}
(但请注意选项)
对于那些需要@pteofil 在 Objective-c
中回答的人- (void)openRealm {
NSString *defaultRealmPath = [RLMRealm defaultRealm].path;
NSString *bundleRealmPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"default.realm"];
if(![[NSFileManager defaultManager] fileExistsAtPath:defaultRealmPath]) {
[[NSFileManager defaultManager] copyItemAtPath:bundleRealmPath toPath:defaultRealmPath error:nil];
}
}
正在为 Swift 2.2/Realm 1.0.2 更新@pteofil 的 openRealm 函数:
func openRealm() {
let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
let bundleReamPath = NSBundle.mainBundle().URLForResource("default", withExtension: "realm")
if !NSFileManager.defaultManager().fileExistsAtPath(defaultURL.path!) {
do {
try NSFileManager.defaultManager().copyItemAtURL(bundleReamPath!, toURL: defaultURL)
}
catch {}
}
}
Swift 版本 3,由 Kishikawa Katsumi:
提供let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let bundleReamPath = Bundle.main.path(forResource: "default", ofType:"realm")
if !FileManager.default.fileExists(atPath: defaultRealmPath.path) {
do
{
try FileManager.default.copyItem(atPath: bundleReamPath!, toPath: defaultRealmPath.path)
}
catch let error as NSError {
// Catch fires here, with an NSError being thrown
print("error occurred, here are the details:\n \(error)")
}
}
在企业工作 space,我需要为每个应用程序打开一个 Realm,而不是在所有应用程序中重复使用 Realm,所以我将它放在一起用于 Swift 3.0。将此函数添加到 AppDelegate。
func openRealm()
{
let appName = "ApplcationNameGoesHere"
var rlmConfig = Realm.Configuration()
let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let appRealmPath = defaultRealmPath.deletingLastPathComponent().appendingPathComponent("\(appName).realm")
if !FileManager.default.fileExists(atPath: appRealmPath.path) {
// Use the default directory, but replace the filename with the application name: appName
rlmConfig.fileURL = rlmConfig.fileURL!.deletingLastPathComponent().appendingPathComponent("\(appName).realm")
}else
{
rlmConfig.fileURL = appRealmPath
}
// Set this as the configuration used for the default Realm
Realm.Configuration.defaultConfiguration = rlmConfig
}// open the Realm database for the application
以上代码根据本例中的 appName 变量打开或创建文件名为 "ApplicationNameGoesHere.realm" 的 Realm。
地方
openRealm() before return true in application: didFinishLaunchingWithOptions
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
openRealm()
return true
}
在另一个 class 中这样调用它:
let uiRealm = try! Realm()
如果您想直接从包位置打开它而不是将其复制到默认的 Realm 路径,请查看实现 here
在您的系统中下载 Realm Studio。然后从Xcode打印路径并复制:
print(Realm.Configuration.defaultConfiguration.fileURL!)
然后打开终端并写入:
open //file path
它将在 Realm Studio 中打开文件,您可以在那里看到您的模型数据。