2009-04-04 9 views
32

Lorsque je crée initialement un fichier de base de données SQLite avec des ensembles de données pré-insérés pour mon application, je dois placer ce fichier quelque part dans mon projet Xcode afin qu'il soit utilisé dans mon application iPhone. Je suppose que les «ressources» sont le bon endroit pour cela. Quelles sont les "étapes" de base pour le déploiement d'un fichier de base de données SQLite dans une application iPhone?Où placer votre fichier de base de données SQLite dans une application iPhone?

  • la création de la base de données manuellement
  • ajouter le fichier de base de données du projet (où?)

Je lis actuellement toute la documentation SQLite, bien que ce soit pas grand-chose pour l'iPhone lié.

Répondre

70

Vous devez d'abord ajouter le fichier SQLite à votre projet Xcode - l'emplacement le plus approprié est dans le dossier des ressources. Ensuite, dans votre fichier de code de délégué d'application, dans la méthode appDidFinishLaunching, vous devez d'abord vérifier si une copie inscriptible du fichier SQLite a déjà été créée, c'est-à-dire: une copie du fichier SQLite a été créée dans les utilisateurs dossier de documents sur le système de fichiers de l'iPhone. Si oui, vous ne faites rien (sinon vous l'écraseriez avec la copie Xcode SQLite par défaut)

Si non, alors vous copiez le fichier SQLite là - pour le rendre inscriptible. Voir l'exemple de code ci-dessous pour cela: ceci a été extrait de l'exemple de code des livres SQLite d'Apple où cette méthode est appelée à partir de la méthode appDidFinishLaunching des délégués d'application.

// Creates a writable copy of the bundled default database in the application Documents directory. 
- (void)createEditableCopyOfDatabaseIfNeeded { 
    // First, test for existence. 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bookdb.sql"]; 
    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if (success) 
     return; 
    // The writable database does not exist, so copy the default to the appropriate location. 
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"bookdb.sql"]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
    if (!success) { 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
} 

============

Voici le code ci-dessus dans Swift 2.0+

// Creates a writable copy of the bundled default database in the application Documents directory. 
private func createEditableCopyOfDatabaseIfNeeded() -> Void 
{ 
    // First, test for existence. 
    let fileManager: NSFileManager = NSFileManager.defaultManager(); 
    let paths:NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
    let documentsDirectory:NSString = paths.objectAtIndex(0) as! NSString; 
    let writableDBPath:String = documentsDirectory.stringByAppendingPathComponent("bookdb.sql"); 

    if (fileManager.fileExistsAtPath(writableDBPath) == true) 
    { 
     return 
    } 
    else // The writable database does not exist, so copy the default to the appropriate location. 
    { 
     let defaultDBPath = NSBundle.mainBundle().pathForResource("bookdb", ofType: "sql")! 

     do 
     { 
      try fileManager.copyItemAtPath(defaultDBPath, toPath: writableDBPath) 
     } 
     catch let unknownError 
     { 
      print("Failed to create writable database file with unknown error: \(unknownError)") 
     } 
    } 
} 
+0

pouvez-vous s'il vous plaît la page d'où vous obtenez le code? Merci. – itsaboutcode

+0

Où devrait être la base de données si vous voulez écrire dessus? Je sais que s'il est dans le groupe Resourses (Main Bundle), il est en lecture seule, alors quelle est la bonne façon de permettre à la fois, l'écriture et la lecture? Merci! –

+0

Je sais que c'est un peu en retard, mais comment pourrais-je trouver si elle a besoin de mise à jour à partir du bundle principal? J'ai essayé de vérifier les attributs de fichier, mais la date de modification du fichier dans l'application change chaque fois que je compile une nouvelle version. – Flipper

6

Si vous allez juste à la recherche de données, vous devriez pouvoir le laisser dans le paquet principal.

Ceci, cependant, n'est probablement pas une bonne pratique. Si vous deviez étendre votre application à l'avenir pour permettre l'écriture de base de données, vous auriez à tout comprendre à nouveau ...

+3

@ Willi Pas nécessairement vrai. S'il devait étendre son application à l'avenir, il pourrait toujours ajouter la fonctionnalité ci-dessus dans une mise à jour. Devrait fonctionner de façon transparente. –

Questions connexes