2015-05-27 9 views
14

Sto sviluppando un'applicazione per iOS utilizzando swift e scelto Realm come soluzione di database per esso. Ho scritto i dati di default in AppDelegate usando la funzione di scrittura/aggiunta dei documenti di realm e funziona perfettamente. Quindi, dopo il primo avvio, ho un file * .realm con i miei dati iniziali. Nella documentazione di Realm ho trovato una sezione chiamata "Bundling a Realm with an App", aggiungo il mio file * .realm al progetto e alle fasi di generazione come è stato scritto.Realm - Aggiungi il file con i dati iniziali al progetto (iOS/Swift)

E non riesco a capire cosa dovrei fare dopo (e parte sulla compressione di un file * .realm). Ho cercato di capire un codice da Migration Example ma non conosco bene l'Obj-C.

Si prega di fornire come passaggi chiari possibile aggiungere il file * .realm con i dati iniziali per velocizzare il progetto ios e caricare questi dati sul dominio db con il primo avvio.

+0

Che cosa è poco chiaro? Il collegamento alla documentazione descrive già tutti i passaggi necessari per aggiungere un database di seed alla tua app. – tilo

+0

La domanda principale suppongo sia come accedere ai dati dal file caricato nel codice. Quando creo Realm() nel codice va bene. Ma come "aprire" questo file nel codice per caricare i dati da esso nel database delle app? O come usare questo file come db stesso (come ho capito dall'ultimo punto di Building a Realm con una sezione App è possibile). – Max

+0

Mai lavorato con Realm, ma come indicato nel punto 6 della documentazione, puoi semplicemente chiamare Realm (percorso :) con il percorso appropriato. – tilo

risposta

17

implementare questa funzione openRealm in AppDelegate e lo chiamano in

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

Sarà copiare il file regno che è incluso nel programma di app per il percorso regno di default, se non esiste già. Dopo di che utilizzi il reame normalmente come prima.

Esiste anche l'esempio di migrazione di cui si è parlato in Swift.

In Swift 3.0.1 si può preferire questo:

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

(ma fate attenzione con gli optionals)

+0

E un'altra ancora. Prima di leggere la tua risposta ho fatto il mio file default.realm nella cartella del progetto come file dm realm di lavoro (non lo voleva ma era semplice). I dati si leggono bene da esso, la mia funzione che scrive i dati funziona senza errori e scrive un dato (aggiungo println () e mi dà l'elemento creato) ma quando apro default.realm nel Browser (o rieseguire un'app) non ci sono nuovi dati solo uno iniziale. – Max

+0

openRealm() funziona alla grande! Silenzioso semplice, grazie. – Max

+0

collegamento aggiornato all'esempio di migrazione: https://github.com/realm/realm-cocoa/blob/master/examples/ios/swift-2.2/Migration/AppDelegate.swift –

3

E per coloro che hanno bisogno @ risposta di pteofil in 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]; 
    } 
} 
+1

Hai confuso 'stringByAppendingPathComponent' e' stringByAppendingString'. –

+1

whoops, risolto !! – ninjaneer

1

Aggiornamento della funzione openRealm di @pteofil per Swift 2.2/Realm 1.0.2:

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 {} 
     } 

} 
3

Swift versione 3, per gentile concessione di 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)") 
} 
} 
0

lavoro nello spazio enterprise, ho bisogno di aprire un Reame per ogni applicazione, senza riutilizzare Realm in tutte le applicazioni così ho messo questo insieme per Swift 3.0. Aggiungi questa funzione all'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 

Il codice di cui sopra si apre o si crea un Reame con il nome del file di "ApplicationNameGoesHere.realm" in base alla variabile appName in questo esempio.

posto

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 

}

chiamata in un'altra classe in questo modo:

let uiRealm = try! Realm() 
+0

Un piccolo suggerimento: è sempre più sicuro scartare il componente del percorso fileURL opzionale e procedere alla funzione solo quando si ha un percorso non facoltativo ... anche se è laborioso e fastidioso da fare, è una buona pratica e alla fine diventa automatico. – Natalia

0

Se si desidera aprirlo direttamente dalla posizione fascio e non si preoccupano di copiare al percorso di default, guarda l'implementazione here

Problemi correlati