2011-10-06 5 views
3

Nous utilisons Visual Studio 2010, MonoDroid et SQLitetables Sqlite lors du déploiement sur MonoDroid à

Nous créons une base de données au chemin myContext.GetDatabasePath ("mydb.db3"). AbsolutePath en utilisant la SqliteConnection.CreateFile (. ..) méthode. Donc, notre chaîne de connexion est "Source de données =/data/data/myapp.myapplication/databases/mydb.db3temp;"

Nous créons une table et insérons plusieurs enregistrements en utilisant SqliteCommand.ExecuteNonQuery().

Nous pouvons exécuter des requêtes select avec SqliteCommand.ExecuteScalar() immédiatement après l'insertion.

méthode SqliteDataAdapter.Fill (table) ne fonctionne pas correctement et nous donne cette exception:

System.EntryPointNotFoundException: sqlite3_column_origin_name 
at (wrapper managed-to-native) Mono.Data.Sqlite.UnsafeNativeMethods:sqlite3_column_origin_name (intptr,int) 
at Mono.Data.Sqlite.SQLite3.ColumnOriginalName (Mono.Data.Sqlite.SqliteStatement stmt, Int32 index) [0x00000] in <filename unknown>:0 
at Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (Boolean wantUniqueInfo, Boolean wantDefaultValue) [0x00000] in <filename unknown>:0 
at Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable() [0x00000] in <filename unknown>:0 
at System.Data.Common.DataAdapter.BuildSchema (IDataReader reader, System.Data.DataTable table, SchemaType schemaType, MissingSchemaAction missingSchAction, MissingMappingAction missingMapAction, System.Data.Common.DataTableMappingCollection dtMapping) [0x00000] in <filename unknown>:0 
at System.Data.Common.DataAdapter.BuildSchema (IDataReader reader, System.Data.DataTable table, SchemaType schemaType) [0x00000] in <filename unknown>:0 
at System.Data.Common.DataAdapter.FillTable (System.Data.DataTable dataTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords, System.Int32& counter) [0x00000] in <filename unknown>:0 
at System.Data.Common.DataAdapter.FillInternal (System.Data.DataTable dataTable, IDataReader dataReader) [0x00000] in <filename unknown>:0 
at System.Data.Common.DataAdapter.Fill (System.Data.DataTable dataTable, IDataReader dataReader) [0x00000] in <filename unknown>:0 
at System.Data.Common.DbDataAdapter.Fill (System.Data.DataTable dataTable, IDbCommand command, CommandBehavior behavior) [0x00000] in <filename unknown>:0 
at System.Data.Common.DbDataAdapter.Fill (System.Data.DataTable dataTable) [0x00000] in <filename unknown>:0 
at (wrapper remoting-invoke-with-check) System.Data.Common.DbDataAdapter:Fill (System.Data.DataTable) 
at ... 

Si nous apportons des modifications au code d'application et de redéployer, le fichier db existe toujours sur l'appareil Android mais SqliteCommand.ExecuteScalar() et SqliteDataAdapter.Fill (tableau) jetteront exceptions qui disent que la table n'existe pas:

Mono.Data.Sqlite.SqliteException: SQLite error 
no such table: MyTable 
at Mono.Data.Sqlite.SQLite3.Prepare (Mono.Data.Sqlite.SqliteConnection cnn, System.String strSql, Mono.Data.Sqlite.SqliteStatement previous, UInt32 timeoutMS, System.String& strRemain) [0x00000] in <filename unknown>:0 
at Mono.Data.Sqlite.SqliteCommand.BuildNextCommand() [0x00000] in <filename unknown>:0 

Est-ce comportement attendu MonoDroid? Devrions-nous perdre les tables après avoir redéployé l'application? Comment devrions-nous utiliser SqliteDataAdapter.Fill()?

Merci

+0

Avez-vous essayé d'extraire le fichier de base de données de l'appareil et de l'ouvrir dans un navigateur de base de données pour voir si la table existe? –

+0

Je n'avais pas encore essayé. Je viens de l'essayer maintenant, les tables n'existent pas. – Joel

Répondre

3

Par défaut, les fichiers que vous créez obtenir supprimé lors de la désinstallation de l'application sur Android. Dans Visual Studio, accédez à Outils-> Options-> Mono pour Android et activez «Conserver les données entre les déploiements d'applications». Cela va passer un drapeau à désinstaller qui lui dit de laisser vos données sur l'appareil.

+0

Pourquoi ne le fait-il pas par défaut? Quelle est la motivation pour que ce soit une option et non le comportement par défaut? De plus, cela n'explique pas la présence de db mais les tables qui manquent. –

+0

C'est la valeur par défaut d'Android que les applications ne laissent pas un tas de merde sur votre appareil lorsque vous les désinstallez. – jpobst

+0

Ok. D'accord. La vraie question que j'aurais dû poser était de savoir pourquoi ce comportement de déploiement diffère de la façon dont IntelliJ Idea/éclipse (android) ou même xcode (iOS) se déploient là où ils n'effacent pas les données utilisateur lors des exécutions suivantes. Ils ne semblent pas réinstaller l'application qui a déjà été déployée. –

Questions connexes