为啥 SQLite 替换功能会在我的 Android 应用程序中产生错误?
Posted
技术标签:
【中文标题】为啥 SQLite 替换功能会在我的 Android 应用程序中产生错误?【英文标题】:Why SQLite replace function produce an error in my Android App?为什么 SQLite 替换功能会在我的 Android 应用程序中产生错误? 【发布时间】:2021-10-11 19:53:36 【问题描述】:我需要自定义列表中的项目。为此,我添加了一个额外的列并按其排序:
public Cursor getAllItems()
qry = "SELECT id,details,type,
(replace(replace(replace(replace(Type,'Day','1Day'),'MONTHLY','2MONTHLY'),
'EBUDGET','4BUDGET'),'CARD','3CARD')) as list1" +
" from items_TB order by substr(list1,1,4), details";
c2 = db.rawQuery(qry, null);
return c2;
这很好用,可以编译和安装,但也会产生错误:
')', , SELECT, VALUES 或 WITH 预期,得到“替换”。
注意这个函数之前的 80 行我有一个非常相似的查询(不同的表),没有错误警告:
public Cursor getRecordsMonth(String month,String q)
if(q.equals("partial"))
qry="Select id, DATE, Amount, (replace(replace(replace(replace(Type,'Day-',''),'MONTHLY-
',''),'EBUDGET',''),'CREDIT -','')) || ' • ' || DETAILS,Type "+
" from records_TB where date like '%"+month+"' order by Type desc";
c1 = db.rawQuery(qry, null);
return c1;
有什么建议吗?
【问题讨论】:
在构建qry
字符串之后和在rawQuery
中使用它之前记录它很有用,因为通常在构建字符串后更容易看到问题,通常是缺少/多余的空格、逗号、括号
【参考方案1】:
我认为 android Studio 解析 SQL 不正确,因为使用了替换(将所有替换更改为替换并且语法错误被抑制(显然 SQL 会失败,如果留在那里)。
要规避看起来是错误的问题,您可以使用以下方法“欺骗”Android Studio:-
public Cursor getAllItems()
//qry = "SELECT id,details,type, (replace(replace(replace(replace(Type,'Day','1Day'),'MONTHLY','2MONTHLY'),'EBUDGET','4BUDGET'),'CARD','3CARD')) as list1" + " from items_TB order by substr(list1,1,4), details";
String list1Col = "(replace(replace(replace(replace(type,'Day','1Day'),'MONTHLY','2MONTHLY'), 'EBUDGET','4BUDGET'),'CARD','3CARD')) AS list1";
qry = "SELECT id,details,type," + list1Col + " from items_TB order by substr(list1,1,4), details";
return db.rawQuery(qry, null);
原文已被注释掉。
可以直接返回结果,不需要c2 = .... return c2
另一种避免语法错误的方法是使用 SQLiteDatabase query
便捷方法,它可以是:-
/* Alternative using the query convenience method */
public Cursor getAllItemsAlt1()
String[] columns = new String[]
"id","details","type","(replace(replace(replace(replace(type,'Day','1Day'),'MONTHLY','2MONTHLY'),'EBUDGET','4BUDGET'),'CARD','3CARD')) AS list1"
;
return db.query("items_TB",columns,null,null,null,null,"substr(list1,1,4),details");
【讨论】:
我使用第一个建议,非常聪明和明确的答案。非常感谢。以上是关于为啥 SQLite 替换功能会在我的 Android 应用程序中产生错误?的主要内容,如果未能解决你的问题,请参考以下文章