2010-06-24 7 views
0

Je veux introduire la possibilité pour l'application my core-data de télécharger un nouveau fichier sqlite et mettre à jour ses données stockées. Notez que le modèle de données ne change pas.upsert de données de base iPhone à partir de sqlite téléchargé

Dans un premier temps, je ne m'inquiète pas des changements apportés par l'utilisateur aux données stockées et je veux simplement l'écraser. Je trouve que la seule façon dont les données stockées sont mises à jour est de changer le nom du fichier sqlite ..?

  • Existe-t-il une façon standard de fusionner, via des données de base, 2 fichiers sqlite? Ainsi, garder les données modifiées par l'utilisateur.
  • Une mise à jour (fichier sqlite téléchargé) peut-elle être un sous-ensemble des données de base fournies sqlite? Notez que sqlite contient des informations binaires. Je pense que this SO question ne répond pas à ces questions.

    Merci pour toute orientation!

  • Répondre

    0

    Si vous souhaitez mettre à jour un fichier de base de données sans modifier la base de données existante, vous devez mettre en œuvre comme celui-ci

    - (void)applicationDidFinishLaunching:(UIApplication *)application { 
    
    [self createEditableCopyOfDatabaseIfNeeded]; 
    
    } 
    
    - (void)createEditableCopyOfDatabaseIfNeeded { 
    
        // First, test for existence - we don't want to wipe out a user's DB 
    
        NSFileManager *fileManager = [NSFileManager defaultManager]; 
    
        NSString *documentDirectory = [self applicationDocumentsDirectory]; 
    
        NSString *writableDBPath = [documentDirectory stringByAppendingPathComponent:@"DataBaseName.sqlite"]; 
    
        BOOL dbexits = [fileManager fileExistsAtPath:writableDBPath]; 
    
        if (!dbexits) { 
    
         // The writable database does not exist, so copy the default to the appropriate location. 
         NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"DataBaseName.sqlite"]; 
    
         NSError *error; 
         BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
         if (!success) { 
    
          NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    
         } 
    
        } 
    
    } 
    
    0

    Je sais que c'est une vieille question, mais après avoir abordé moi-même je voulais juste ajouter les points suivants:

    • Le fichier sqlite par défaut d'un magasin de données principal, yourProjectName.sqlite, semble être protégé. L'écrasement ne fonctionne pas. Vous devrez faire ce que raaz suggéré ci-dessus et créer une copie.
    • Après avoir créé la copie, vous pouvez remplacer le fichier facilement. Cependant, certaines suggestions dans d'autres réponses montrent que la meilleure façon d'écraser le fichier sqlite de données de base est de le supprimer en premier. Cela ne fonctionne pas sur l'appareil! Il génère une erreur indiquant qu'il n'a pas pu supprimer le fichier. Il fonctionne dans le simulateur, mais pas sur l'appareil (testé sur une 3G sur 4.2)
    • Ainsi, le meilleur moyen est de simplement écraser le fichier plutôt que de le supprimer et d'en créer un nouveau.
    • Et bien sûr, assurez-vous d'enlever le magasin du coordonnateur de magasin persistant d'abord!

    Mon 2c, j'espère que cela aidera quelqu'un.

    Questions connexes