2017-02-01 21 views
0

Я инициализация моего экземпляра области действия так:Как создать пользовательский файл области действие

private static let sUserRealm:Realm = try! Realm(configuration:Realm.Configuration(
     fileURL: Bundle.main.url(forResource: "user" ,withExtension: "realm"), 
     inMemoryIdentifier: nil, 
     syncConfiguration: nil, 
     encryptionKey: nil, 
     readOnly: false, 
     schemaVersion: 0, 
     migrationBlock: sMigrationBlock, 
     deleteRealmIfMigrationNeeded: true, 
     objectTypes: nil)) 

Однако я gettting этой ошибки:

fatal error: A Realm Configuration must specify a path or an in-memory 
identifier.: file /Users/realm/workspace/Package iOS Swift/tightdb_objc/RealmSwift/RealmConfiguration.swift, line 201 

Всего царство имеет в своей быстрой документации о создании нескольких областей - пример this, и даже копирование его дословно вызывает такую ​​же ошибку. Как создать и получить доступ к файлу области?

ответ

0

использование Bundle.main.url(forResource: "user" ,withExtension: "realm")! но это значение может быть nil из файла не существует

вместо Bundle.main.url(forResource: "user" ,withExtension: "realm")

быть осторожным и настройка

EDIT

Чтобы использовать предопределенная база данных, вы можете использовать Bundle.

Но если вы хотите использовать новую базу данных для своего приложения, используйте другой путь. Не расслоение.

https://realm.io/docs/swift/latest/

var config = Realm.Configuration() 

    // Use the default directory, but replace the filename with the username 
    config.fileURL = config.fileURL!.deletingLastPathComponent() 
         .appendingPathComponent("\(username).realm") 

чем

sUserRealm:Realm = try! Realm(configuration:config)

или любой путь, который вы хотите, но не Bundle.

создавать и редактировать файлы и каталоги:

let fileManager:FileManager = FileManager.default 
     let documentdir:String = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! 

     let dbName = someDataBaseFileName 

     let yourFullFileName = String(format:"%@/%@",documentdir,dbName) 

// или

let yourFullPath:String = URL(fileURLWithPath: documentdir).appendingPathComponent(dbName).path 
+0

'Bundle.main.url (forResource:«пользователь», withExtension:«царство»)' возвращает NIL, поэтому он выдает ошибку – shoe

+0

так что это ответ. вы кормите 'Realm' значением' nil'. – Vyacheslav

+0

@shoe неправильный путь так – Vyacheslav

2

Bundle.url(forResource:withExtension:) возвращает путь к существующего файла в пределах данного пучка. В части документации Realm, на которую вы ссылаетесь, используется пример включения файла Realm в комплект приложения.

Так это выглядит, как вы пытаетесь создать новый файл Realm на определенном пути, вы должны вычислить, что путь и установить его в качестве fileURL на Realm.Configuration. Обычно вы не хотите использовать API Bundle, поскольку файлы в комплекте вашего приложения не могут быть записаны. Вместо этого вы должны построить путь относительно вашего приложения документа или кэш-каталог:

let documentDirectory = FileManager.default.url(for: .documentDirectory, in: .userDomainMask, 
               appropriateFor: nil, create: false) 
let url = documentDirectory.appendingPathComponent("my-new-realm.realm") 
+0

, но если вы включите файл realm в свой пакет приложений, [будет ли он не доступен только для чтения] (http://stackoverflow.com/a/5026133/6744473)? – shoe

+0

Да? Если у вас есть файл Realm в вашем комплекте приложений, в который вы хотите записать, вам нужно сначала скопировать его в папку, доступную для записи. не работая с файлом Realm, который был включен как часть вашего пакета приложений, создайте путь, который указывает на каталог документа или кэша. – bdash