0

当我通过 id 查询表时,有时会出现这样的错误:

Caused by android.database.sqlite.SQLiteException: variable number must be between ?1 and ?999 (Sqlite code 1 SQLITE_ERROR): , 
       while compiling: SELECT * FROM chat_ads WHERE _id IN (?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19,?20,?21,?22,?23,?24,?25,?26,?27,?28,?29,?30,?31,?32,?33,?34,?35,?36,?37,?38,?39,?40,?41,?42,?43,?44,?45,?46,?47,?48,?49,?50,?51,?52,?53,?54,?55,?56,?57,?58,?59,?60,?61,?62,?63,?64,?65,?66,?67,?68,?69,?70,?71,?72,?73,?74,?75,?76,?77,?78,?79,?80,?81,?82,?83,?84,?85,?86,?87,?88,?89,?90,?91,?92,?93,?94,?95,?96,?97,?98,?99,?100,?101,?102,?103,?104,?105,?106,?107,?108,?109,?110,?111,?112,?113,?114,?115,?116,?117,?118,?119,?120,?121,?122,?123,?124,?125,?126,?127,?128,?129,?130,?131,?132,?133,?134,?135,?136,?137,?138,?139,?140,?141,?142,?143,?144,?145,?146,?147,?148,?149,?150,?151,?152,?153,?154,?155,?156,?157,?158,?159,?160,?161,?162,?163,?164,?165,?166,?167,?168,?169,?170,?171,?172,?173,?174,?175,?176,?177,?178,?179,?180,?181,?182,?183,?184,?185,?186,?187,?188,?189,?190,?191,?192,?193,?194,?195,?196,?197,?198,?199,?200,?201,?202,?203,?204,?205,?206,?207,?208,?209,?210,?211,?212,?213,?214,?215,?216,?217,?218,?219,?220,?221,?222,?223,?224,?225,?226,?227,?228,?229,?230,?231,?232,?233,?234,?235,?236,?237,?238,?239,?240,?241,?242,?243,?244,?245,?246,?247,?248,?249,?250,?251,?252,?253,?254,?255,?256,?257,?258,?259,?260,?261,?262,?263,?264,?265,?266,?267,?268,?269,?270,?271,?272,?273,?274,?275,?276,?277,?278,?279,?280,?281,?282,?283,?284,?285,?286,?287,?288,?289,?290,?291,?292,?293,?294,?295,?296,?297,?298,?299,?300,?301,?302,?303,?304,?305,?306,?307,?308,?309,?310,?311,?312,?313,?314,?315,?316,?317,?318,?319,?320,?321,?322,?323,?324,?325,?326,?327,?328,?329,?330,?331,?332,?333,?334,?335,?336,?337,?338,?339,?340,?341,?342,?343,?344,?345,?346,?347,?348,?349,?350,?351,?352,?353,?354,?355,?356,?357,?358,?359,?360,?361,?362,?363,?364,?365,?366,?367,?368,?369,?370,?371,?372,?373,?374,?375,?376,?377,?378,?379,?380,?381,?382,?383,?384,?385,?386,?387,?388,?389,?390,?391,?392,?393,?394,?395,?396,?397,?398,?399,?400,?401,?402,?403,?404,?405,?406,?407,?408,?409,?410,?411,?412,?413,?414,?415,?416,?417,?418,?419,?420,?421,?422,?423,?424,?425,?426,?427,?428,?429,?430,?431,?432,?433,?434,?435,?436,?437,?438,?439,?440,?441,?442,?443,?444,?445,?446,?447,?448,?449,?450,?451,?452,?453,?454,?455,?456,?457,?458,?459,?460,?461,?462,?463,?464,?465,?466,?467,?468,?469,?470,?471,?472,?473,?474,?475,?476,?477,?478,?479,?480,?481,?482,?483,?484,?485,?486,?487,?488,?489,?490,?491,?492,?493,?494,?495,?496,?497,?498,?499,?500,?501,?502,?503,?504,?505,?506,?507,?508,?509,?510,?511,?512,?513,?514,?515,?516,?517,?518,?519,?520,?521,?522,?523,?524,?525,?526,?527,?528,?529,?530,?531,?532,?533,?534,?535,?536,?537,?538,?539,?540,?541,?542,?543,?544,?545,?546,?547,?548,?549,?550,?551,?552,?553,?554,?555,?556,?557,?558,?559,?560,?561,?562,?563,?564,?565,?566,?567,?568,?569,?570,?571,?572,?573,?574,?575,?576,?577,?578,?579,?580,?581,?582,?583,?584,?585,?586,?587,?588,?589,?590,?591,?592,?593,?594,?595,?596,?597,?598,?599,?600,?601,?602,?603,?604,?605,?606,?607,?608,?609,?610,?611,?612,?613,?614,?615,?616,?617,?618,?619,?620,?621,?622,?623,?624,?625,?626,?627,?628,?629,?630,?631,?632,?633,?634,?635,?636,?637,?638,?639,?640,?641,?642,?643,?644,?645,?646,?647,?648,?649,?650,?651,?652,?653,?654,?655,?656,?657,?658,?659,?660,?661,?662,?663,?664,?665,?666,?667,?668,?669,?670,?671,?672,?673,?674,?675,?676,?677,?678,?679,?680,?681,?682,?683,?684,?685,?686,?687,?688,?689,?690,?691,?692,?693,?694,?695,?696,?697,?698,?699,?700,?701,?702,?703,?704,?705,?706,?707,?708,?709,?710,?711,?712,?713,?714,?715,?716,?717,?718,?719,?720,?721,?722,?723,?724,?725,?726,?727,?728,?729,?730,?731,?732,?733,?734,?735,?736,?737,?738,?739,?740,?741,?742,?743,?744,?745,?746,?747,?748,?749,?750,?751,?752,?753,?754,?755,?756,?757,?758,?759,?760,?761,?762,?763,?764,?765,?766,?767,?768,?769,?770,?771,?772,?773,?774,?775,?776,?777,?778,?779,?780,?781,?782,?783,?784,?785,?786,?787,?788,?789,?790,?791,?792,?793,?794,?795,?796,?797,?798,?799,?800,?801,?802,?803,?804,?805,?806,?807,?808,?809,?810,?811,?812,?813,?814,?815,?816,?817,?818,?819,?820,?821,?822,?823,?824,?825,?826,?827,?828,?829,?830,?831,?832,?833,?834,?835,?836,?837,?838,?839,?840,?841,?842,?843,?844,?845,?846,?847,?848,?849,?850,?851,?852,?853,?854,?855,?856,?857,?858,?859,?860,?861,?862,?863,?864,?865,?866,?867,?868,?869,?870,?871,?872,?873,?874,?875,?876,?877,?878,?879,?880,?881,?882,?883,?884,?885,?886,?887,?888,?889,?890,?891,?892,?893,?894,?895,?896,?897,?898,?899,?900,?901,?902,?903,?904,?905,?906,?907,?908,?909,?910,?911,?912,?913,?914,?915,?916,?917,?918,?919,?920,?921,?922,?923,?924,?925,?926,?927,?928,?929,?930,?931,?932,?933,?934,?935,?936,?937,?938,?939,?940,?941,?942,?943,?944,?945,?946,?947,?948,?949,?950,?951,?952,?953,?954,?955,?956,?957,?958,?959,?960,?961,?962,?963,?964,?965,?966,?967,?968,?969,?970,?971,?972,?973,?974,?975,?976,?977,?978,?979,?980,?981,?982,?983,?984,?985,?986,?987,?988,?989,?990,?991,?992,?993,?994,?995,?996,?997,?998,?999,?1000), (OS error - 11:Try again)
       at android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
       at android.database.sqlite.SQLiteConnection.acquirePreparedStatement + 948(SQLiteConnection.java:948)
       at android.database.sqlite.SQLiteConnection.prepare + 559(SQLiteConnection.java:559)
       at android.database.sqlite.SQLiteSession.prepare + 603(SQLiteSession.java:603)
       at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:63)
       at android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37)
       at android.database.sqlite.SQLiteDirectCursorDriver.query + 46(SQLiteDirectCursorDriver.java:46)
       at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory + 1493(SQLiteDatabase.java:1493)
       at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory + 1463(SQLiteDatabase.java:1463)
       at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.query + 161(FrameworkSQLiteDatabase.java:161)
       at com.squareup.sqldelight.android.AndroidQuery.executeQuery + 220(AndroidQuery.java:220)
       at com.squareup.sqldelight.android.AndroidQuery.executeQuery + 195(AndroidQuery.java:195)
       at com.squareup.sqldelight.android.AndroidSqliteDriver$executeQuery$2.invoke + 132(AndroidSqliteDriver.java:132)
       at com.squareup.sqldelight.android.AndroidSqliteDriver$executeQuery$2.getOwner(AndroidSqliteDriver.java:132)
       at com.squareup.sqldelight.android.AndroidSqliteDriver$executeQuery$2.invoke + 19(AndroidSqliteDriver.java:19)
       at com.squareup.sqldelight.android.AndroidSqliteDriver.execute + 114(AndroidSqliteDriver.java:114)
       at com.squareup.sqldelight.android.AndroidSqliteDriver.executeQuery + 132(AndroidSqliteDriver.java:132)
       at classifieds.yalla.data.local.presentation.ChatAdsQueriesImpl$GetChatAds.execute + 688(ChatAdsQueriesImpl.java:688)
       at com.squareup.sqldelight.Query.executeAsList + 113(Query.java:113)

似乎限制是数组中的 1000 个项目,文档中的任何地方都没有说明。

表本身

CREATE TABLE chat_ads(
    _id INTEGER NOT NULL PRIMARY KEY,
    ...
);

更新:

如果我需要按 id 查询 1000 多个项目,有什么替代解决方案?目前,关系是每个都chat_ad与 many 相关chats,所以我只是在chat表中存储一个 id,然后查询用户需要的任何项目。

4

3 回答 3

1

SQLite 文档指出:

单个 SQL 语句
中的最大主机参数数 SQLite 分配空间来保存从 1 到使用的最大主机参数数之间的所有主机参数。因此,包含主机参数(如 ?1000000000)的 SQL 语句将需要千兆字节的存储空间。这很容易使主机的资源不堪重负。为防止过多的内存分配,主机参数编号的最大值为SQLITE_MAX_VARIABLE_NUMBER默认为 999

所以你可以设置一个更高的值

于 2019-07-26T09:56:43.050 回答
1

您可以在此处的 SQLite 官方文档中找到有关所有限制的信息

对于 Android 版本的 SQLite,您无法更改此限制,因为它是在编译时配置的。您可以尝试构建自己的 SQLite 版本,但可能最简单的解决方案是修改查询。

于 2019-07-26T09:57:10.753 回答
0

这意味着您正在尝试在 Integer (_id) 中设置字符串值

请分享您的模式代码。

我可以与您分享类似的问题,开发人员尝试使用字符串更新整数值,但他们得到了同样的错误。

Android SQLite 错误:变量号必须介于 ?1 和 ?999 之间

于 2019-07-26T09:57:11.597 回答