在我的一個Android應用程序中,我使用了一些SQLite
查詢,自從我更新至Android Studio 3.0
以來,這些查詢開始出現問題。由Android Studio標記爲Error的Android SQLite查詢
儘管我可以編譯並運行應用程序,但它們被標記爲錯誤。
這些是查詢。
db.execSQL("INSERT INTO table1 (…) ... substr(replace(table2.field2, ',', ''), table1.field1, 1) … FROM table1 … WHERE …");
給出錯誤 '取代':
')' 或表達期望,得到了 '代替'
,我認爲這會工作,因爲replace
返回String
。
和:
db.execSQL("DELETE FROM table1 WHERE table1.rowid IN (…)");
給出錯誤的 'ROWID':
列名或表名預期,得到了 '的rowid'
,我認爲這會工作過,因爲SQLite
爲每個表添加了一個隱含的rowid
。
和:
db.execSQL("ATTACH DATABASE ? as newDB", new String[] { getDatabasePath(DATABASE_NAME_NEW).getPath() });
給出錯誤 '?':
表達期望,得到了 '?'
我已經改變了該查詢到這一點:
db.execSQL("ATTACH DATABASE '"+getDatabasePath(DATABASE_NAME_NEW).getPath()+"' as newDB");
另外:
db.execSQL("UPDATE table1 SET field1=0 WHERE field2 IN
(SELECT field2 FROM table2 WHERE field3 LIKE '%blablabla%' OR field4 LIKE '%blebleble%' OR (field5 LIKE '%bliblibli%' AND field6 NOT LIKE '%blobloblo%')
COLLATE NOCASE)");
其中給出這些錯誤:
在 '字段6 NOT LIKE':
')' 要麼 '。'預計,得到了 '不'
在 'NOCASE)':
BETWEEN,IN或分號預期,得到了 ')'
我不知道什麼是錯的這個。
這些查詢是否正確?在iOS中是相同的,他們工作得很好。
UPDATE:
這些都是完整查詢(不幸的是,由於我的客戶端的安全政策,我必須要改變的表和字段的名字,但我希望是好的檢測錯誤)。
db.execSQL("INSERT INTO table1 (field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14) " +
"SELECT t6.field1, t7.field2, t3.field4, t3.field5, CASE WHEN t5.field1='1' THEN '11' " +
"WHEN t5.field1='2' THEN '22' WHEN t5.field1='3' THEN '33' WHEN t5.field1='4' THEN '44' " +
"ELSE t5.field1 END AS newfield1, t4.field1, CASE WHEN t2.field1 = '0' THEN t4.field2 " +
"ELSE substr(replace(t4.field3, ',', ''), t2.field1, 1) END AS newfield2, t2.field4, '0', -1, '0', '1', -1, t8.field1 " +
"FROM table2 AS t2, table3 AS t3, table4 AS t4, table5 AS t5, table6 AS t6, table7 AS t7, table8 AS t8 " +
"WHERE t2.field2=t3.field3 AND t2.field3=t4.field1 AND t2.field3=t5.field2 AND t3.field2=t7.field2 AND " +
"t3.field1=t6.field1 AND substr(t5.field1, 1, 1) IN ('1', '2', '3', '4') AND substr(t5.field1, 2, 1) IN ('1', '2', '3', '4') AND t2.field5=t8.field2");
db.execSQL("DELETE FROM table1 WHERE table1.rowid IN (SELECT table1.rowid FROM table1, table4 AS t4 WHERE table1.field6=t4.field1 AND (((t4.field2 NOT LIKE '%%' || substr(table1.field5, 1,1) || '%%') AND (t4.field3 NOT LIKE '%%' || substr(table1.field5, 1,1) || '%%')) OR ((t4.field2 NOT LIKE '%%' || substr(table1.field5, 2,1) || '%%') AND (t4.field3 NOT LIKE '%%' || substr(table1.field5, 2,1) || '%%'))))");
db.execSQL("ATTACH DATABASE ? as newDB", new String[] { getDatabasePath(DATABASE_NAME_NEW).getPath() });
Changed to:
db.execSQL("ATTACH DATABASE '"+getDatabasePath(DATABASE_NAME_NEW).getPath()+"' as newDB");
And the error is gone.
db.execSQL("UPDATE table1 SET field13=1 WHERE field2 IN (SELECT t7.field2 FROM table7 AS t7 WHERE t7.field1='Text1' OR t7.field1='Text2' OR t7.field1 LIKE '%TEXT3%' OR t7.field1 LIKE '%TEXT4%' OR t7.field1 LIKE '%TEXT5%' OR t7.field1 LIKE '%TEXT6%' OR (t7.field1 LIKE '%TEXT7%' AND t7.field1 NOT LIKE '%TEXT8%') COLLATE NOCASE)");
? –
您配置了哪些Android版本? –
我配置了Android 23(6.0)。關於完整的問題,我會盡力發佈。 – Wonton