Как создать пользовательский файл области

Я инициализирую свой экземпляр области следующим образом:

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))

Однако я получаю эту ошибку:

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

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


person shoe    schedule 01.02.2017    source источник


Ответы (4)


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

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

let documentDirectory = FileManager.default.url(for: .documentDirectory, in: .userDomainMask,
                                                appropriateFor: nil, create: false)
let url = documentDirectory.appendingPathComponent("my-new-realm.realm")
person bdash    schedule 01.02.2017
comment
но если вы включите файл области в свой пакет приложений, он не будет доступен только для чтения? - person shoe; 02.02.2017
comment
Да? Если у вас есть файл Realm в вашем комплекте приложений, в который вы хотите записать, вам нужно сначала скопировать его куда-нибудь, доступный для записи. Если вы не работаете с файлом Realm, который был включен в комплект вашего приложения, вместо этого создайте путь, указывающий на каталог документа или кэша. - person bdash; 02.02.2017

Свифт 5:

Просто настройте имя файла вашей области

struct Kingdom {
    static let persist = Kingdom()

    let realm: Realm = { () -> Realm in
        var config = Realm.Configuration()
        config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("deng.realm")
        let land = try! Realm(configuration: config)
        return land
    }()
}

настройте имя и путь файла вашей области

struct Kingdom {
    static let persist = Kingdom()

    let realm: Realm = { () -> Realm in
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let documentsDirectory = paths[0]
        let docURL = URL(string: documentsDirectory)!
        let dataPath = docURL.appendingPathComponent("Dng")
        if FileManager.default.fileExists(atPath: dataPath.absoluteString) == false{
            do {
                try FileManager.default.createDirectory(atPath: dataPath.absoluteString, withIntermediateDirectories: true, attributes: nil)
            } catch {
                print(error.localizedDescription)
            }
        }
        do {
            var config = Realm.Configuration()
            config.fileURL = dataPath.appendingPathComponent("deng.realm")
            let realmReal = try Realm(configuration: config)
            return realmReal
        } catch {
            print(error.localizedDescription)
            let realmForSyntax = try! Realm()
            return realmForSyntax
        }
    }()
}

111

person dengST30    schedule 06.03.2020

Это пример класса конфигурации Realm, каждая конфигурация создает новый файл Realm.

     import Foundation
     import RealmSwift

     class RealmConfiguration {

// Create "default.realm" in document file
        public static var defaultDataConfiguration = Realm.Configuration.defaultConfiguration

// Create "insensitive.realm"
        static func insensitiveDataConfiguration() -> Realm.Configuration {
            var config = Realm.Configuration()
            config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("insensitive.realm")
            return config
        }

// Create "sensitive.realm"
        static func sensitiveDataConfiguration() -> Realm.Configuration {
            var config = Realm.Configuration()
            config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("sensitive.realm")
            return config
        }
    }
person Hamed    schedule 15.12.2018
comment
Я использовал это, но ни одно из них не будет работать в сегодняшнем расширении - person Saeed Rahmatolahi; 14.03.2020
comment
На самом деле у меня нет ошибки, когда я использую это, это будет работать, но только в приложении и в расширении, я не могу получить доступ к этому файлу, и он обрабатывается так, как будто файла нет. - person Saeed Rahmatolahi; 17.03.2020
comment
Мне нужно увидеть код, я понятия не имею о вашей проблеме. - person Hamed; 17.03.2020
comment
Я могу дать вам доступ в Team Viewer, чтобы увидеть мои коды, если хотите - person Saeed Rahmatolahi; 17.03.2020
comment
Нет, у меня нет времени, извините, задайте новый вопрос и поделитесь им здесь или разместите здесь свой код - person Hamed; 17.03.2020

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

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

будьте осторожны и настраивайте

ИЗМЕНИТЬ

Чтобы использовать предопределенную базу данных, вы можете использовать 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)

//or

let yourFullPath:String = URL(fileURLWithPath: documentdir).appendingPathComponent(dbName).path
person Vyacheslav    schedule 01.02.2017
comment
Bundle.main.url(forResource: "user" ,withExtension: "realm") возвращает nil, поэтому выдает ошибку - person shoe; 01.02.2017
comment
так что это ответ. вы кормите Realm значением nil. - person Vyacheslav; 01.02.2017
comment
не ответ. вопрос в том, как мне создать и получить доступ к файлу области? тот факт, что мы теперь знаем, что я кормлю область значением nil, не удовлетворяет этот вопрос - person shoe; 01.02.2017