2009-11-09 2 views
1

i mon application à déployer mon iPhone et obtenirComment puis-je changer sqlite ReadOnly en ReadWrite sur l'iPhone?

Unknown error calling sqlite3_step (8: attempt to write a readonly database) eu sur les états Insérer/Mettre à jour.

Sur le simulateur, tout fonctionne comme il se doit.

Ma base de données sqlite est placée dans le dossier de ressources (Xcode).

Merci pour l'aide!

+0

Peut-être que vous l'avez déjà fait, veuillez vérifier la permission de votre base de données. – aobs

Répondre

6

Votre lot d'applications n'est pas accessible en écriture sur l'iPhone. Vous DOIT copier le fichier ailleurs, comme votre dossier de documents. Cela fonctionne dans le simulateur parce que le Mac n'applique pas toutes les restrictions de bac à sable que l'iPhone fait.

+0

Ok, mais comment ça fonctionne pour "livrer" une base de données sqlite avec mon application? – phx

1

Vous pouvez copier votre base de données du répertoire du regroupement d'applications dans le répertoire Documents de viewDidLoad. Vous pouvez lire/écrire depuis/vers votre base de données dans le répertoire Documents après cela. Bien sûr, vous devez vérifier si la base de données dans le répertoire Documents existe avant de faire la copie afin de ne pas l'écraser lors de la prochaine utilisation de l'application.

En supposant que vous avez défini votre nom de base de données '#define kFilename @ "yourdatabase.db"' dans le fichier .m.

En viewDidLoad ajouter:


// Get the path to the main bundle resource directory. 

NSString *pathsToReources = [[NSBundle mainBundle] resourcePath]; 

NSString *yourOriginalDatabasePath = [pathsToResources stringByAppendingPathComponent:kFilename]; 

// Create the path to the database in the Documents directory. 

NSArray *pathsToDocuments = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *documentsDirectory = [pathsToDocuments objectAtIndex:0]; 

NSString *yourNewDatabasePath = [documentsDirectory stringByAppendingPathComponent:kFilename]; 

if (![[NSFileManager defaultManager] isReadableFileAtPath:yourNewDatabasePath]) { 

if ([[NSFileManager defaultManager] copyItemAtPath:yourOriginalDatabasePath toPath:yourNewDatabasePath error:NULL] != YES) 

NSAssert2(0, @"Fail to copy database from %@ to %@", yourOriginalDatabasePath, yourNewDatabasePath); 

} 

Bonne chance!

aobs

+1

Désolé, mais na pas fonctionne vraiment pour moi: mon chemin ressemble: /var/mobile/Applications/30D76248-1E01-4A60-9986-EA4417762A01/Documents/mytable.sqlite Mais je ne peux pas écrire quoi que ce soit à la base de données: ( – phx

Questions connexes