#.net #sqlite #data-synchronization
#.net #sqlite #синхронизация данных
Вопрос:
Возможно ли иметь какой-либо преобразователь типов, который позволяет Sync Framework обрабатывать строки «0» / «1» как логические значения для false / true. Согласно документации bool.parse, это не поддерживается по умолчанию, так что есть ли способ обойти это?
Более подробная информация на случай, если кто-то может предложить другой подход к этой проблеме: у меня есть пользовательская клиентская реализация Sync Framework для Android, и поскольку она использует базу данных SQLite, у меня нет возможности применить какой-либо строгий тип данных к полю таблицы. Я мог бы придумать соглашение для указания логического поля, скажем, с префиксом «Is», но это было бы неприятно. Другое дело, что логические значения в SQLite обрабатываются как числовой тип, таким образом, вставка / обновление логических значений false / true в базу данных SQLite автоматически преобразует их в 0/1, и я не хочу вводить какое-либо преобразование TRUE / FALSE = 1/0 на стороне Android.
Любые мысли приветствуются.
[ОБНОВЛЕНИЕ] Более подробная информация: Серверная часть состоит из некоторых служб, использующих Microsoft Sync Framework 4.0 CTP. Настраивать особо нечего, кроме создания области видимости и так далее. Клиентская сторона генерирует набор изменений и передает его на сервер, используя формат JSON. Набор изменений поступает из базы данных SQLite (а SQLite не имеет никакого собственного логического представления, кроме числового 0/1), поэтому при чтении базы данных нет указаний на то, что поступающие данные имеют логический тип. Значение поля сериализуется в объект JSON в виде строки с числовым значением («0» или «1»), и, таким образом, серверная сторона завершает работу с ошибкой при попытке преобразовать его в bool.
Кстати, это можно обойти, выполнив одностороннюю синхронизацию клиент-сервер. Я вручную установил тип поля сущности на стороне сервера в байт, и Sync Framework прекрасно использует его как «битный» тип базы данных. Этот обходной путь не работает для взаимодействия сервер-клиент, хотя.
Комментарии:
1. @eugene приведение к bool не компилируется
2. Почему бы просто не:
"1".Equals(val)
?3. @Eugene Преобразование происходит на стороне сервера, и оно выполняется внутренней частью Sync Framework. Платформа синхронизации . У меня нет никакого контроля над тем, как это делается.
4. У вас есть какой-нибудь код для показа?
5. @Jonas не совсем, это связано не с существующим исходным кодом, а с тем, как c # boolean не может анализировать 0/1 как логические значения.
Ответ №1:
Обычный способ в C # / .NET заключается в использовании Convert.ToBoolean()
Комментарии:
1. О, извините, я, кажется, совершенно неправильно понял, что проблема заключается внутри Sync framework, с которым у меня почти нет опыта…
Ответ №2:
Я не хочу вводить какое-либо преобразование TRUE / FALSE = 1/0 на стороне Android
Похоже, вам придется это сделать, поскольку в SQLite нет логического типа.
boolean active = cursor.getInt(column_idx)==1;
Комментарии:
1. Но я действительно … действительно не хочу этого делать, поскольку это добавляет в книгу еще одно правило для всех разработчиков, которые собираются использовать эту библиотеку синхронизации. Кстати, это не проблема сохранения логических значений в виде числового типа, это то, что используется на Android по умолчанию, но MS Sync Framework не любит преобразовывать 0/1 в false / true. Должно быть наоборот, используйте строку «true» / «false» на Android, а затем напоминайте разработчикам, чтобы они всегда преобразовывали эти значения в правильный логический тип.
Ответ №3:
что касается битов Sync Framework, вы пробовали внедрять перехватчики для перехвата изменений и выполнения преобразования? смотрите: Как: Расширить бизнес-логику на сервере с помощью перехватчиков
Комментарии:
1. Да, я пытался использовать это, но, к сожалению, interceptor предоставляет только уже созданные объекты, и в данном случае это не удается, потому что объект не может быть сконструирован в первую очередь (поскольку данные JSON не могут быть проанализированы).
Ответ №4:
Таким образом, становится невозможным выполнить то, что я прошу, каким-либо простым способом. В конце я решил добавить дополнительные функциональные возможности в библиотеку синхронизации Android для анализа определений таблиц SQLite и использования описаний полей для форматирования исходящих данных синхронизации.
Спасибо вам всем за ваши усилия.