为什么SQLite替换函数在我的Android应用程序中产生错误



我需要在列表中自定义订单项。为了做到这一点,我添加了一个额外的列和ORDER:

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,但得到了"replace"。

注意,在这个函数之前有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;
}

有什么建议吗?

我认为Android Studio对SQL的解析是错误的,因为使用了replace(将所有replace改为replac,语法错误就会被忽略(显然,如果不这样做,SQL就会失败)。

为了避免出现错误,您可以";傻瓜;安卓工作室通过使用:-

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

另一种避免语法错误的方法是使用SQLiteDatabasequery便利方法,该方法可以是:-

/* 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");
}

最新更新