Есть ли какие-либо ограничения для предложения WHERE IN в sqlite на Android?

Иногда я получаю такую ​​ошибку, когда запрашиваю таблицу по идентификаторам:

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,
    ...
);

ОБНОВИТЬ:

Какое альтернативное решение, если мне нужно запросить более 1000 элементов по идентификатору? В настоящее время отношения таковы, что каждыйchat_ad относится ко многим chats, поэтому я просто сохраняю идентификатор в chat table, а затем запросить, сколько элементов нужно пользователю.

3 ответа

Вы можете найти информацию обо всех ограничениях в официальной документации SQLite здесь

Для версии SQLite для Android вы не можете изменить это ограничение, поскольку оно настраивается во время компиляции. Вы можете попробовать создать свою собственную версию SQLite, но, вероятно, самым простым решением будет изменение запроса.

В документе SQLite указано:

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

Таким образом, вы можете установить более высокое значение

Это означает, что вы пытаетесь установить строковое значение внутри Integer (_id)

Пожалуйста, поделитесь своим кодом режима.

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

Ошибка Android SQLite: номер переменной должен быть от?1 до?999

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