为啥 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 应用程序中产生错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥用户帐户设置会在我的计算机中干扰我网站的管理页面

如何选择性地替换 sqlite 行?

Matplotlib 为啥我点击后绘图功能会在按钮内绘制?

为啥这会在我的控制台上打印两次? [复制]

为啥 GCC 会在我的机器上创建额外的汇编指令?

如果我使用核心数据,如何用新文件替换 sqlite 文件?