2010-08-12 6 views
3

A partir des sqlite3 docs il semble que je devrais pouvoir utiliser la syntaxe suivante pour mettre à jour une ligne dans une base de données sur mon iPhone:de mise à jour de la syntaxe de la ligne


NSString *dbFile = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"db"]; 
sqlite3 *database = NULL; 

if (sqlite3_open([dbFile UTF8String], &database) == SQLITE_OK) { 
NSString *sql = [NSString stringWithFormat:@"update mytable set myfirstcolumn=%d, mysecondcolumn=%d where id=%d", int1, int2, int3]; 
sqlite3_exec(database, [sql UTF8String], MyCallback, nil, nil); 
} 

sqlite3_close(database); 

Mais il ne met pas à jour la base de données ou même appeler la méthode de rappel. Est-ce juste la mauvaise syntaxe, comme dans sqlite3_exec() ne peut pas effectuer une mise à jour par exemple?

Dans mon exemple, tous les noms de colonnes sont corrects et les trois valeurs int grume comme les valeurs correctes, donc je suis un peu d'idées ...

Merci.

Répondre

0

sqlite3_exec renvoie généralement un code d'erreur (int), et le dernier paramètre peut être un pointeur sur une chaîne qui va définir un message d'erreur. Que disent ceux-ci?

sqlite3_exec(database, [sql UTF8String], MyCallback, nil, &errorMsg); 
+0

Salut, Je viens de vérifier le code d'erreur et il retourne 8 (SQLITE3_READONLY) qui est un point de départ pour moi d'explorer maintenant. Je n'ai pas réalisé que les fichiers dans le paquet étaient en lecture seule. Une idée où et comment placer le fichier de base de données dans une zone de lecture-écriture? –

+0

De même, dois-je avoir une seule instance de la base de données, disons dans le délégué de l'application, que toutes les autres classes accèdent? Accéder à la base de données en utilisant le code comme ci-dessus dans mon message d'origine de différentes classes continuerait à créer une nouvelle instance de la base de données d'origine et remplacer tous les nouveaux changements, non? –

+1

@I Hemstock - Vous n'êtes pas obligé d'avoir une seule instance de base de données, mais il est probablement logique de le faire. Généralement, vous avez une seule instance de base de données par thread. Les modifications de la base de données seront partagées entre tous les objets d'instance de base de données de votre application. C'est ainsi que SQLite est conçu. –

2

Ah, à droite, a trouvé le processus maintenant qui peut répondre à la requête de quelqu'un d'autre. Fondamentalement, j'avais la base de données dans le paquet de ressources avec quelques données de base pour mes tests que je pourrais lire très bien. Mais parce que la ressource bundle est en lecture seule, je ne pouvais pas écrire des données dans la base de données. La solution consiste donc à copier par programme la base de données dans le dossier Documents de l'application au démarrage de l'application, mais avec un code pour voir si la base de données existe déjà (afin de ne pas l'écraser). Parce que ce dossier est en lecture-écriture, il ne devrait pas y avoir de problème lors de la mise à jour de la base de données.

Questions connexes