#sqlite #xamarin.android
#sqlite #xamarin.android
Вопрос:
Мы используем Visual Studio 2010, Monodroid и SQLite
Мы создаем базу данных по пути MyContext.GetDatabasePath («mydb.db3»).Абсолютный путь с использованием SQLiteConnection.Метод CreateFile(…).
Итак, наша строка подключения — «Источник данных =/data/data/myapp.myapplication/базы данных/mydb.db3temp;»
Мы создаем таблицу и вставляем несколько записей с помощью SQLiteCommand .ExecuteNonQuery() .
Мы можем запускать запросы select с помощью SQLiteCommand .ExecuteScalar() выполняется сразу после вставки.
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.Int32amp; 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 .Заполнение (таблица) вызовет исключения, которые говорят, что таблица не существует:
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.Stringamp; strRemain) [0x00000] in <filename unknown>:0
at Mono.Data.Sqlite.SqliteCommand.BuildNextCommand () [0x00000] in <filename unknown>:0
Является ли это ожидаемым поведением Monodroid? Должны ли мы потерять таблицы после повторного развертывания приложения? Как мы должны использовать SqliteDataAdapter.Заполнить ()?
Спасибо
Комментарии:
1. Вы пробовали извлекать файл базы данных устройства и открывать его в браузере базы данных и проверять, существует ли таблица?
2. Я раньше этого не пробовал. Я только что попробовал это сейчас, таблицы не существуют.
Ответ №1:
По умолчанию созданные вами файлы удаляются при удалении приложения на Android. В Visual Studio перейдите в меню Инструменты-> Параметры-> Mono для Android и включите «Сохранение данных между развертываниями приложений». Это передаст флаг для удаления, который указывает ему оставить ваши данные на устройстве.
Комментарии:
1. Почему он не делает этого по умолчанию? Какова мотивация для того, чтобы это было опцией, а не поведением по умолчанию? Кроме того, это не объясняет наличие базы данных, но таблицы пропадают.
2. По умолчанию для Android приложения не оставляют кучу мусора на вашем устройстве, когда вы их удаляете.
3. ОК. Согласен. Реальный вопрос, который я должен был задать, заключался в том, почему это поведение при развертывании отличается от того, как развертываются IntelliJ Idea / eclipse (android) или даже xcode (iOS), где они не стирают пользовательские данные при последующих запусках. Похоже, что они не переустанавливают приложение, которое было уже развернуто.