部署到Monodroid时丢失Sqlite表

时间:2011-10-06 00:20:38

标签: sqlite xamarin.android

我们正在使用Visual Studio 2010,Monodroid和SQLite

我们在路径myContext.GetDatabasePath(“mydb.db3”)创建一个数据库。使用SqliteConnection.CreateFile(...)方法的AbsolutePath。

所以我们的连接字符串是“Data Source = / data / data / myapp.myapplication / databases / mydb.db3temp;”

我们创建一个表并使用SqliteCommand.ExecuteNonQuery()插入几个记录。

我们可以在插入后立即使用SqliteCommand.ExecuteScalar()运行select查询。

SqliteDataAdapter.Fill(table)方法无法成功运行并为我们提供此异常:

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 ...

如果我们对应用程序代码进行任何更改并重新部署,那么db文件仍然存在于android设备上,但SqliteCommand.ExecuteScalar()和SqliteDataAdapter.Fill(table)将抛出表示该表不存在的异常:

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  

这是预期的Monodroid行为吗?我们应该在重新部署应用程序后丢失表吗?我们应该如何使用SqliteDataAdapter.Fill()?

由于

1 个答案:

答案 0 :(得分:3)

默认情况下,在Android上卸载应用时,您创建的文件会被删除。在Visual Studio中,转到Tools-&gt; Options-&gt; Mono for Android并启用“在应用程序部署之间保留数据”。这将传递一个标志进行卸载,告诉它将数据留在设备上。