2011-10-06 37 views
3

我们正在使用Visual Studio 2010时失去sqlite的表,MonoDroid的和SQLite部署到MonoDroid的

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

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

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

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

SqliteDataAdapter.Fill(表)方法并不成功运行,并为我们提供了这个异常:

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

如果我们对应用程序代码进行任何更改和重新部署,然后将数据库文件仍然存在在Android设备上但SqliteCommand.ExecuteScalar()和SqliteDataAdapter.Fill(表)会抛出异常是说,表不存在:

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()?

感谢

+0

您是否试过拉动设备的数据库文件,并在数据库浏览器中打开它并查看该表是否存在? –

+0

我以前没有尝试过。我现在只是试了一下,表格不存在。 – Joel

回答

3

默认情况下,文件创建在卸载Android上的应用程序被删除。在Visual Studio中,转至工具 - >选项 - > Mono for Android并打开“在应用程序部署之间保留数据”。这将通过一个标志来卸载,告诉它将数据留在设备上。

+0

为什么它默认不这样做?这是一个选项而不是默认行为的动机是什么?此外,这并不解释数据库存在,但表丢失。 –

+0

这是Android的默认设置,应用程序在卸载它们时不会在设备上留下大量废话。 – jpobst

+0

好的。同意。我应该问的真正问题是,为什么这种部署行为与IntelliJ Idea/eclipse(android)甚至xcode(iOS)部署的不同之处在于它们不会在后续运行时擦除用户数据。他们似乎没有重新安装已经部署的应用程序。 –