2010-07-30 3 views
2

Travailler avec MonoTouch .NET pour iPhone et SQLite sur Mac OSX. Je peux lire de la base de données sans problème. Cependant, lorsque je tente d'apporter des modifications à la base de données, j'ai un comportement étrange. Le code ci-dessous s'exécute sans exception, mais aucun changement réel n'est apporté à la base de données. Je peux créer une table, insérer un enregistrement, sélectionner cet enregistrement et l'afficher dans la console. Mais, quand je ferme la connexion DB, tous ces changements disparaissent. En outre, si je mets un point d'arrêt dans le code avant conn.Close() et vérifie la base de données, la table n'existe pas. On dirait que je ne travaille qu'avec une base de données imaginaire qui répond à des instructions SQL réelles. Bizarre.Les modifications apportées à SQLite sont perdues après la connexion.Fermez()

Ce code se exécute mais ne pas écrire quoi que ce soit à la base de données:

const string _connectionString = "Data Source=App_Data/MyDatabaseFile"; 

var conn = new SqliteConnection(_connectionString); 
conn.Open(); 

var command = conn.CreateCommand(); 

command.CommandText = "CREATE TABLE Test (id integer primary key AUTOINCREMENT, text varchar(100))"; 
command.ExecuteNonQuery(); 

var cmd2 = conn.CreateCommand(); 
cmd2.CommandText = "INSERT INTO Test (Text) Values ('test test test')"; 
var rowsAffected = cmd2.ExecuteNonQuery(); //rowsAffected is 1 

var cmd3 = conn.CreateCommand(); 
cmd3.CommandText = "SELECT * FROM Test"; 
var reader = cmd3.ExecuteReader(); 
Console.WriteLine(reader["text"]); //writes "test test test" to console, nothing in database 

conn.Close(); 

Si j'exécute les mêmes instructions SQL dans dans le navigateur SQLite, ils fonctionnent très bien:

CREATE TABLE Test (id integer primary key AUTOINCREMENT, text varchar(100)); 
INSERT INTO Test (Text) Values ('test test test'); 
SELECT * FROM Test; 

... rendements {id = 1, text = 'test test test'}

Vous pouvez probablement le dire, mais il vaut la peine de mentionner que je n'utilise pas de transactions.

MISE À JOUR:

Intéressant ... Je peux changer le code ci-dessus qui exécute la requête SELECT pour regarder dans 'Test2' (table inexistante) et il jette un SQLiteException: "No such table: Test2" .

J'ai également essayé d'encapsuler le code ci-dessus dans une transaction sur l'occasion que SQLite exige des transactions ... pas de dés.

MISE À JOUR # 2:

Adam a suggéré d'essayer d'ouvrir une nouvelle connexion et SELECT de la nouvelle table avant de nouveau arrêter l'application. J'ai ajouté le code suivant après le code ci-dessus:

var conn2 = new SqliteConnection(_connectionString); 
conn2.Open(); 
var cmd4 = conn2.CreateCommand(); 
cmd4.CommandText = "SELECT * FROM Test"; 
var reader2 = cmd4.ExecuteReader(); 
Console.WriteLine("2nd attempt: " + reader2["text"]); //outputs correctly 
conn.Close(); 

D'accord, donc mon hypothèse sur les changements qu'il perd après Connection.Close() est incorrect. Il a définitivement trouvé la nouvelle ligne insérée et l'a sortie sur la console. Toutefois, la table et la ligne disparaissent après l'arrêt de l'application.

+0

Est-ce que c'est dans un émulateur de périphérique? Au lieu de regarder la base de données, pouvez-vous essayer de créer une commande de code pour sélectionner ce que vous venez d'insérer? –

+0

Oui. J'utilise monoDevelop et le simulateur d'iPhone. J'ai regardé la base de données, mais le code ci-dessus essaie également de sélectionner ce qui a été inséré. –

+0

Donc, ça ne le fait pas. –

Répondre

2

Pour toute personne ayant la même question, je pensais que je devrais aller de l'avant et poster mes conclusions. Le comportement que j'ai décrit dans mon post original est principalement par conception. Pour être plus clair, voici une meilleure explication:

Lorsque MonoDevelop déploie votre application sur le simulateur iPhone, une COPIE de votre base de données SQLite va avec pour vivre dans l'environnement iPhone. Ainsi, lorsque votre application modifie votre base de données, la base de données d'origine n'est pas touchée. Lorsque votre application s'arrête, les modifications que vous avez apportées à la copie du simulateur de votre base de données sont perdues. Cependant, lorsque l'application est en cours d'exécution, vous pouvez insérer, mettre à jour, supprimer et sélectionner tout ce que vous voulez et tout devrait fonctionner comme prévu.

Ceci n'est vrai que lors de l'utilisation du simulateur.

Questions connexes