【问题标题】: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 中使用它之前记录它很有用,因为通常在构建字符串后更容易看到问题,通常是缺少/多余的空格、逗号、括号

标签: android sqlite replace


【解决方案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");
}

【讨论】:

  • 我使用第一个建议,非常聪明和明确的答案。非常感谢。
猜你喜欢
  • 2021-04-03
  • 2021-08-11
  • 1970-01-01
  • 2013-01-07
  • 2022-01-10
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
相关资源
最近更新 更多