Xamarin SQLite-net и связанная проблема (повторяющееся имя столбца: objectId)

Недавно я перешел на SQLite-net из-за того, что он поддерживает новые изменения в Android 7.0, но это вызывает у меня серьезные проблемы. Я думаю, что это связано с компоновщиками, но не совсем уверен, как решить эту проблему.

Во-первых, если создать мое приложение в режиме отладки и выпуска, оно отлично работает. Без вопросов. Если я затем заархивирую свое приложение (сгенерирую подписанный APK), оно начнет падать в разные моменты в зависимости от настроек компоновщика.

Если я настрою свое приложение на сборку с помощью Sdk и пользовательских сборок, мое приложение мгновенно выйдет из строя. Вот часть журнала: -

Caused by: android.runtime.JavaProxyThrowable: SQLite.SQLiteException: duplicate column name: objectId
                                                 at SQLite.SQLite3.Prepare2 (SQLitePCL.sqlite3 db, System.String query) [0x0001e] in <1096ddd2a2894a619279903f1fa07799>:0 
                                                 at SQLite.SQLiteCommand.Prepare () [0x00011] in <1096ddd2a2894a619279903f1fa07799>:0  

Если я настрою свое приложение на использование только Sdk, оно будет работать немного иначе. Он фактически запускает приложение, загружает половину данных. Если я попытаюсь обновить данные, добавив больше, произойдет сбой. Затем приложение будет аварийно завершать работу при запуске каждый раз, пока я не удалю все локальное хранилище для этого приложения, после чего оно будет работать отлично.

Я также читал о пропуске связывания сборок, и в этом случае я пропустил все библиотеки, связанные с SQL.

--linkskip=SQLite-net --linkskip=SQLite.NET --linkskip=SQLite.Net.Platform.XamarinAndroid --linkskip=SQLite.Net.Platform.XamarinAndroidN --linkskip=SQLiteNetExtensions --linkskip=SQLitePCLRaw.batteries_green --linkskip=SQLitePCLRaw.batteries_v2 --linkskip=SQLitePCLRaw.core --linkskip=SQLitePCLRaw.lib.e_sqlite3 --linkskip=SQLitePCLRaw.provider.e_sqlite3 

У кого-нибудь есть идеи, как решить эту проблему. Я хотел выпустить приложение в ближайшее время, но не могу обойти это. Очень похожие вещи происходят и с моим приложением для iOS, которое работает в той же БД.

Заранее спасибо!


person Phill Wiggins    schedule 21.01.2017    source источник
comment
Можете ли вы узнать, на каком языке SQL возникла ошибка дублирования столбца? Вы можете выбрать две таблицы с одинаковым именем столбца objectId.   -  person Mike Ma    schedule 23.01.2017
comment
Спасибо, Майк. Не совсем уверен, что произошло, но я удалил все ссылки на все библиотеки SQLite, которые у меня были, и переустановил их. Проблема вскоре ушла без каких-либо изменений кода. Я также удалил скиплинки. Я думаю, что, возможно, я ссылался на две отдельные библиотеки SQLite, которые не будут работать вместе.   -  person Phill Wiggins    schedule 23.01.2017
comment
Поскольку вы решили проблему, пожалуйста, закройте вопрос. Спасибо.   -  person jgoldberger - MSFT    schedule 02.02.2017
comment
@jgoldberger У меня недостаточно баллов, чтобы закрыть вопрос.   -  person Phill Wiggins    schedule 02.02.2017
comment
В качестве альтернативы вы можете ответить на него и принять свой собственный ответ. Просто убирает из результатов поиска при поиске вопросов без ответов. :-)   -  person jgoldberger - MSFT    schedule 03.02.2017


Ответы (1)


Итак, я узнал, что делать и как это преодолеть.

Если вы столкнулись с этой проблемой, скорее всего, вы создаете таблицу на основе модели. Это умный поступок во многих случаях. Но обратите внимание, что это использует отражение. Стоит отметить в FAQ на github:

Поскольку sqlite-net использует отражение, компоновщик MT не понимает, что ему нужны различные свойства. Затем он удаляет эти свойства из класса.

https://github.com/praeclarum/sqlite-net/wiki/FAQ

И что теперь?

У вас есть два варианта, как я вижу.

[Сохранить] атрибут

Я не очень опытен в этом подходе. На самом деле, я действительно не нашел хорошей документации, чтобы пройти через это. Так что я не могу это особо прокомментировать.

Запись операторов Create

Просто сделав

connection.Execute("create table ....."); 

Это позволит вам создавать таблицы без повторяющихся столбцов и, таким образом, использовать компоновщик. Ура!

person user3093826    schedule 19.02.2017