Ошибка при выполнении команды SQLite: "слишком много переменных SQL" ограничение Azure PullAsync в форме xamarin android

Это выглядит как ограничение от мобильного клиента Microsoft Azure для сервиса автономной синхронизации для Android.
В моем приложении формы xamarin у меня есть 40 таблиц Azure для синхронизации с удаленным. Всякий раз, когда конкретный запрос (_abcTable.PullAsync) имеет больше числовых записей, таких как 5K, PullAsync возвращает исключение, сообщающее, что: Ошибка выполнения команды SQLite: "слишком много переменных SQL".
Этот асинхронный URL-адрес извлечения выглядит следующим образом: https://abc-xyz.hds.host.com/AppHostMobile/tables/XXXXXXResponse? $ Filter = (updatedAt ge datetimeoffset'2017-06-20T13: 26: 17.8200000% 2B00: 00 ') & $ orderby = updatedAt & $ skip = 0 & $ top = 5000 & ProjectId = 2 & __ includeDeleted = true.

Но в почтальоне я вижу тот же URL-адрес, который возвращает записи 5K и отлично работает на устройстве iPhone, но не работает только на Android.
Из вышеприведенного запроса PullAsync, если я изменю значение параметра "top" с 5000 на 500, он прекрасно работает в Android, но занимает больше времени. Есть ли у меня какие-либо другие альтернативы без ограничения производительности.

Версия пакета:
Microsoft.Azure.Mobile.Client version = "3.1.0"
Microsoft.Azure.Mobile.Client.SQLiteStore "версия =" 3.1.0 "
Microsoft.Bcl версия = "1.1.10"
Microsoft.Bcl.Build version = "1.0.21"
SQLite.Net.Core-PCL version = "3.1.1"
SQLite.Net-PCL версия = "3.1.1"
SQLitePCLRaw.bundle_green version = "1.1.2"
SQLitePCLRaw.core "version =" 1.1.2 "
SQLitePCLRaw.lib.e_sqlite3.android "version =" 1.1.2 "
SQLitePCLRaw.provider.e_sqlite3.android "version =" 1.1.2 "
Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации. Спасибо

1 ответ

Ошибка выполнения команды SQLite: "слишком много переменных SQL

Насколько я понимаю, ваш sqlite может касаться максимального количества параметров хоста в отдельном операторе SQL, упоминает следующее:

Параметр хоста является заполнителем в операторе SQL, который заполняется с помощью одного из интерфейсов sqlite3_bind_XXXX(). Многие программисты SQL знакомы с использованием знака вопроса ("?") В качестве параметра хоста. SQLite также поддерживает именованные параметры хоста с предваряющими ":", "$" или "@" и пронумерованные параметры хоста в форме "?123".

Каждому параметру хоста в инструкции SQLite присваивается номер. Числа обычно начинаются с 1 и увеличиваются на единицу с каждым новым параметром. Однако когда используется форма "? 123", номер параметра хоста - это число, которое следует за знаком вопроса.

SQLite выделяет пространство для хранения всех параметров хоста между 1 и наибольшим номером используемого параметра хоста. Следовательно, для оператора SQL, который содержит параметр хоста, например, 1000000000, потребуется гигабайт хранилища. Это может легко перегрузить ресурсы хост-машины. Чтобы избежать чрезмерного выделения памяти, максимальное значение номера параметра хоста - SQLITE_MAX_VARIABLE_NUMBER, по умолчанию 999.

Максимальный номер параметра хоста может быть уменьшен во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_VARIABLE_NUMBER,size).

Я сослался на отладку автономного кэша и инициировал MobileServiceSQLiteStore следующее:

var store = new MobileServiceSQLiteStoreWithLogging("localstore.db");

Я зарегистрировал все команды SQL, которые выполняются в хранилище SQLite при вызове pullasync, Я обнаружил, что после успешного получения ответа от мобильного бэкэнда с помощью следующего запроса:

https://{your-app-name}.azurewebsites.net/tables/TodoItem?$filter=((UserId%20eq%20null)%20and%20(updatedAt%20ge%20datetimeoffset'1970-01-01T00%3A00%3A00.0000000%2B00%3A00'))&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true

Microsoft.Azure.Mobile.Client.SQLiteStore.dll выполнит следующую инструкцию sql для обновления связанной локальной таблицы:

НАЧАЛО СДЕЛКИ

Вставить или игнорировать в [TodoItem] ([id]) значения (@p0),(@p1),(@p2),(@p3),(@p4),(@p5),(@p6),(@p7),(@ P8),(@ р9),(@p10),(@p11),(@p12),(@p13),(@p14),(@p15),(@p16),(@p17),(@p18),(@p19),(@p20),(@p21),(@p22),(@p23),(@p24),(@p25),(@p26),(@p27),(@p28),(@p29),(@p30),(@p31),(@p32),(@p33),(@p34),(@p35),(@p36),(@p37),(@p38),(@p39),(@p40),(@p41),(@p42),(@p43),(@p44),(@p45),(@p46),(@p47),(@p48),(@p49)

ОБНОВЛЕНИЕ [TodoItem] SET [Текст] = @p0,[UserId] = @p1 WHERE [id] = @p2

ОБНОВЛЕНИЕ [TodoItem] SET [Текст] = @p0,[UserId] = @p1 WHERE [id] = @p2

,

,

Совершение сделки

Насколько я понимаю, вы можете попытаться установить MaxPageSize до 999. Кроме того, это ограничение от sqlite, и обработка обновлений автоматически обрабатывается Microsoft.Azure.Mobile.Client.SQLiteStore, На данный момент я не нашел подходов переопределить обработку от Microsoft.Azure.Mobile.Client.SQLiteStore,

Другие вопросы по тегам