执行SQLite命令时出错:';SQL变量太多';xamarin表单android中的Azure PullAsync限制

执行SQLite命令时出错:';SQL变量太多';xamarin表单android中的Azure PullAsync限制,sqlite,xamarin,xamarin.forms,azure-mobile-services,xamarin-android-player,Sqlite,Xamarin,Xamarin.forms,Azure Mobile Services,Xamarin Android Player,这看起来像是Microsoft azure移动客户端对android离线同步服务的限制 在我的xamarin表单应用程序中,我有40个azure表要与远程服务器同步。每当特定请求(_abcTable.PullAsync)有更多的数字记录(如5K)时,PullAsync就会返回异常,说明:执行SQLite命令时出错:“SQL变量太多” 拉式异步URL如下所示:?$filter=(updatedAt ge datetimeoffset'2017-06-20T13:26:17.8200000%2B00

这看起来像是Microsoft azure移动客户端对android离线同步服务的限制
在我的xamarin表单应用程序中,我有40个azure表要与远程服务器同步。每当特定请求(_abcTable.PullAsync)有更多的数字记录(如5K)时,PullAsync就会返回异常,说明:执行SQLite命令时出错:“SQL变量太多”
拉式异步URL如下所示:?$filter=(updatedAt ge datetimeoffset'2017-06-20T13:26:17.8200000%2B00:00')&$orderby=updatedAt&$skip=0&$top=5000&projectd=2&\uu includeDeleted=true

但在《邮递员》中,我可以看到相同的Url返回5K记录,在iPhone设备中也可以正常工作,但只有在android中失败。
根据上面的PullAsync请求,如果我将“top”参数值从5000更改为500,它在android中可以正常工作,但需要更多的时间。在不限制性能的情况下,我还有其他选择吗。

软件包版本:
Microsoft.Azure.Mobile.Client version=“3.1.0”
Microsoft.Azure.Mobile.Client.SQLiteStore“version=“3.1.0”

Microsoft.Bcl version=“1.1.10”

Microsoft.Bcl.Build version=“1.0.21”


SQLite.Net.Core-PCL version=“3.1.1”
SQLite.Net-PCL version=“3.1.1”

SQLitePCLRaw.bundle_绿色版本=“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”
如果我需要提供更多信息,请告诉我。谢谢

执行SQLite命令时出错:“SQL变量太多。”

据我所知,您的sqlite可能会涉及以下内容:

var store = new MobileServiceSQLiteStoreWithLogging("localstore.db");
主机参数是SQL语句中的占位符,该语句使用sqlite3_bind_XXXX()接口之一填充。许多SQL程序员都熟悉使用问号(“?”)作为主机参数。SQLite还支持以“:”、“$”或“@”开头的命名主机参数以及格式为“?123”的编号主机参数

SQLite语句中的每个主机参数都分配了一个数字。数字通常以1开头,每增加一个新参数,数字就增加一个。但是,当使用“?123”形式时,主机参数编号是问号后面的编号

SQLite分配空间来保存1到使用的最大主机参数数之间的所有主机参数。因此,包含主机参数(如100000000)的SQL语句需要千兆字节的存储空间。这很容易会占用主机的资源。为防止内存分配过多,主机参数号的最大值为SQLITE\u MAX\u VARIABLE\u number,默认值为999

可以在运行时使用sqlite3_limit(db、SQLITE_limit_变量_number、size)接口降低最大主机参数数

我引用并初始化了我的
MobileServiceSQLiteStore
,如下所示:

var store = new MobileServiceSQLiteStoreWithLogging("localstore.db");
我记录了调用
pullasync
时针对SQLite存储执行的所有SQL命令。我发现通过以下请求从移动后端成功检索响应后:

https://{your app name}.azurewebsites.net/tables/TodoItem?$filter=((UserId%20eq%20null)%20和%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]中插入或忽略插入或忽略到[ToDoDoItem]([id,[id,([id,[id,([id,)插入或忽略到[ToDoDoItem]([id,([id,([id,([id,([id,([id,)人士在[ToDoDodoItem]中插入或忽略或插入或忽略到[ToDoDoDoDoToToToDoItem]中,([[[[[[[id,([[[[[id,,,,,,,([p,,,,,(@p1,,(@p1,,,(@p1,(@p1,,,(@p2,,,(@p2,,(@p2,,,(@p2,,,,,,,,,,(@p2,,,,,(@p2,,,,,,(@p2,,,(@p2,,(@p2,,,,,,,,,,,,,,(@5、(@p36)、(@p37)、(@p38)、(@p39)、(@p40)、(@p41)、(@p42)、(@p43),(@p44),(@p45),(@p46),(@p47),(@p48),(@p49)

更新[TodoItem]设置[Text]=@p0,[UserId]=@p1其中[id]=@p2

更新[TodoItem]设置[Text]=@p0,[UserId]=@p1其中[id]=@p2

提交事务

据我所知,您可以尝试将
MaxPageSize
设置为999。此外,此限制来自sqlite,更新处理由
Microsoft.Azure.Mobile.Client.SQLiteStore
自动处理。目前,我还没有找到任何方法来覆盖
Microsoft.Azure.Mobile.Client.SQLiteStore