在Android程序中的数据库语句中的‘?’报错"<expr>expected, got '?' 的解决办法

随着Android的快速发展,其版本中的一些语句逐渐被替代。在数据库语句里,占位符可能会飘红,文章介绍了旧版本插入、更新、删除语句的改进情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android飞速的发展中,就版本的一些语句逐渐被替代。在数据库语句中出现的占位符有可能会飘红,于是就有新的代替,如下:

旧版本(查询):
Cursor cursor = db.rawQuery("select threadid,position from filedown where downpath=?", new String[]{path});

改进:

Cursor cursor = db.rawQuery("select threadid,position from filedown where downpath='"+path+"'",null);

旧版本(插入):

db.execSQL("insert into filedown(downpath,threadid,position)values(?, ?, ?)", new Object[]{path,entry.getKey(),entry.getValue()});

改进:

db.execSQL("insert into filedown(downpath,threadid,position)values('"+path+"', '"+entry.getKey()+"', '"+entry.getValue()+"')");

旧版本(更新):

db.execSQL(" update filedown set position = ? where downpath = ? and threadid = ?",
new Object[]{entry.getValue(),path,entry.getKey()} );

改进:

db.execSQL(" update filedown set position = '"+entry.getValue()+"' where downpath = '"+path+"' and threadid = '"+entry.getKey()+"'");

旧版本(删除):

db.execSQL("delete from filedown where downpath=?", new Object[]{path});

改进:

db.execSQL("delete from filedown where downpath=' "+path+" '");

#include "Context.h" #include "component.hpp" #include "HandoverRecordSQlite.h" #include "Registry.h" #include "zbjlComponent.h" #include "zbysComponent.h" #include "zzComponentZBFS.h" #include "zbclComponent.h" #include "zzComponentZBCL.h" #include "zbjlComponentFS.h" #include "zbysComponentFS.h" #include "fsclComponentFS.h" #include "jsjlComponentZKJS.h" #include "jsysComponentZKJS2.h" #include "jsxyComponentZKJS.h" #include "jsysComponentJSZK.h" #include "jsxyclComponentZKJS.h" #include "jsComponentZKJS.h" #include "Parser.h" pugi::xml_document doc; //解析xml配置文件 bool parse_config() { //加载xml文件 if (!doc.load_file("config.xml")) { std::cerr << "Failed to load XML file" << std::endl; return false; } std::cout << "parse_config success" << std::endl; doc.save(std::cout, " ", pugi::format_default); return true; } int main() { try { parse_config(); ComponentRegistry::instance().registerComponent<zbjlComponent>("ZBJLComponent"); ComponentRegistry::instance().registerComponent<zbysComponent>("ZBYSComponent"); ComponentRegistry::instance().registerComponent<zzComponentZBFS>("ZZComponentZBFS"); ComponentRegistry::instance().registerComponent<zbclComponent>("ZBCLComponent"); ComponentRegistry::instance().registerComponent<zzComponentZBCL>("ZZComponentZBCL"); ComponentRegistry::instance().registerComponent<zbjlComponentFS>("ZBJLComponentFS"); ComponentRegistry::instance().registerComponent<zbysComponentFS>("ZBYSComponentFS"); ComponentRegistry::instance().registerComponent<fsclComponentFS>("FSCLComponentFS"); ComponentRegistry::instance().registerComponent<jsjlComponentZKJS>("JSJLComponentZKJS"); ComponentRegistry::instance().registerComponent<jsysComponentZKJS2>("JSYSComponentZKJS2"); ComponentRegistry::instance().registerComponent<jsxyComponentZKJS>("JSXYComponentZKJS"); ComponentRegistry::instance().registerComponent<jsysComponentJSZK>("JSYSComponentJSZK"); ComponentRegistry::instance().registerComponent<jsxyclComponentZKJS>("JSXYCLComponentZKJS"); ComponentRegistry::instance().registerComponent<jsComponentZKJS>("JSComponentZKJS"); std::cout << "component registry success" << std::endl; std::string xmlEL = R"(<chain name="chain1">(THEN(ZBJLComponent,IF(ZBYSComponent,ZZComponentZBFS,IF(ZBCLComponent,THEN(ZBJLComponentFS,ZBYSComponentFS,IF(FSCLComponentFS,THEN(JSJLComponentZKJS,IF(JSYSComponentZKJS2,JSComponentZKJS,JSXYComponentZKJS)),THEN(JSJLComponentZKJS,JSYSComponentJSZK,JSXYCLComponentZKJS))),ZZComponentZBCL))))</chain>)"; //std::string xmlEL = R"(<chain name="chain1">(THEN(ZBJLComponent,WHEN(ZBYSComponent,ZZComponentZBFS,THEN(JSComponentZKJS))))</chain>)"; std::string expr = xmlEL.substr(xmlEL.find(">") + 1, xmlEL.rfind("<") - xmlEL.find(">") -1); Parser parser; auto ast = parser.parse(expr); std::cout << "parse EL success" << std::endl; Context ctx; doc.save(std::cout, " ", pugi::format_default); ast->execute(ctx); } catch (const std::exception& e) { std::cerr << "ERROR : " << e.what() << std::endl; return 1; } return 0; } #include "Parser.h" #include <algorithm> #include <stdexcept> #include <sstream> #include <iostream> #include"SingleNode.h" #include"Context.h" #include"IfNode.h" #include"ThenNode.h" #include"WhenNode.h" #include"AndNode.h" #include"NotNode.h" #include"OrNode.h" using namespace std; unique_ptr<ExpressionNode> Parser::parse(const string& expr) { string cleaned = trim(expr.substr(expr.find('(') + 1, expr.rfind(')') - expr.find('(') - 1)); return parseExpression(cleaned); } unique_ptr<ExpressionNode> Parser::parseSingleNode(const string& expr) { if (expr.find("THEN(") != 0 && expr.find("IF(") != 0 && expr.find("WHEN(") != 0 && expr.find("AND(") != 0 && expr.find("OR(") != 0 && expr.find("NOT(") != 0) { return make_unique<SingleNode>(expr); } return parseExpression(expr); } unique_ptr<ExpressionNode> Parser::parseIfExpression(const string& expr) { size_t comma1 = findMatchingBracket(expr, 0); string condition = trim(expr.substr(0, comma1)); size_t comma2 = findMatchingBracket(expr, comma1 + 1); string thenPart = trim(expr.substr(comma1 + 1, comma2 - comma1 - 1)); string elsePart = trim(expr.substr(comma2 + 1)); auto conditionNode = parseLogicalExpression(condition); return make_unique<IfNode>(condition, move(conditionNode), elsePart.empty() ? nullptr : parseExpression(elsePart)); } unique_ptr<ExpressionNode> Parser::parseThenExpression(const string& expr) { vector<unique_ptr<ExpressionNode>> children; size_t pos = 0; while (pos < expr.size()) { size_t end = findMatchingBracket(expr, pos); string item = expr.substr(pos, end - pos); children.push_back(parseExpression(trim(item))); pos = (end == string::npos) ? expr.size() : end + 1; } return make_unique<ThenNode>(move(children)); } unique_ptr<ExpressionNode> Parser::parseWhenExpression(const string& expr) { vector<unique_ptr<ExpressionNode>> children; auto parts = splitComponents(expr); for (const auto& part : parts) { children.push_back(parseExpression(trim(part))); } return make_unique<WhenNode>(move(children)); } vector<string> Parser::splitComponents(const string& expr) { vector<string> parts; int bracketCount = 0; size_t start = 0; for (size_t i = 0; i < expr.size(); ++i) { char c = expr[i]; if (c == '(') { bracketCount++; } else if (c == ')') { bracketCount--; } else if (c == ',' && bracketCount == 0) { string part = expr.substr(start, i - start); parts.push_back(trim(part)); start = i + 1; } } if (start < expr.size()) { string lastPart = expr.substr(start); parts.push_back(trim(lastPart)); } return parts; } unique_ptr<ExpressionNode> Parser::parseExpression(const string& expr) { try { string trimmed = trim(expr); if (trimmed.empty()) { throw runtime_error("Empty expression"); } if (startsWith(trimmed, "THEN(")) { return parseThenExpression(trimmed.substr(5, trimmed.size() - 6)); } if (startsWith(trimmed, "IF(")) { return parseIfExpression(trimmed.substr(3, trimmed.size() - 4)); } if (startsWith(trimmed, "WHEN(") || startsWith(trimmed, "PAR(")) { return parseWhenExpression(trimmed.substr(5, trimmed.size() - 6)); } if (startsWith(trimmed, "AND(")) { return parseAndExpression(trimmed.substr(4, trimmed.size() - 5)); } if (startsWith(trimmed, "OR(")) { return parseOrExpression(trimmed.substr(3, trimmed.size() - 4)); } if (startsWith(trimmed, "NOT(")) { return parseNotExpression(trimmed.substr(4, trimmed.size() - 5)); } return parseSingleNode(trimmed); } catch (const exception& e) { cerr << "Parse EL error: " << e.what() << endl; throw; } } // 新增逻辑表达式解析方法 unique_ptr<ExpressionNode> Parser::parseLogicalExpression(const string& expr) { string trimmed = trim(expr); if (startsWith(trimmed, "AND(")) { return parseAndExpression(trimmed.substr(4, trimmed.size() - 5)); } if (startsWith(trimmed, "OR(")) { return parseOrExpression(trimmed.substr(3, trimmed.size() - 4)); } if (startsWith(trimmed, "NOT(")) { return parseNotExpression(trimmed.substr(4, trimmed.size() - 5)); } return parseSingleNode(trimmed); } unique_ptr<ExpressionNode> Parser::parseAndExpression(const string& expr) { auto parts = splitComponents(expr); vector<unique_ptr<ExpressionNode>> children; for (const auto& part : parts) { children.push_back(parseLogicalExpression(trim(part))); } return make_unique<AndNode>(move(children)); } unique_ptr<ExpressionNode> Parser::parseOrExpression(const string& expr) { auto parts = splitComponents(expr); vector<unique_ptr<ExpressionNode>> children; for (const auto& part : parts) { children.push_back(parseLogicalExpression(trim(part))); } return make_unique<OrNode>(move(children)); } unique_ptr<ExpressionNode> Parser::parseNotExpression(const string& expr) { // 确保NOT表达式只有一个参数 auto parts = splitComponents(expr); if (parts.size() != 1) { throw runtime_error("NOT expression requires exactly one argument"); } return make_unique<NotNode>(parseLogicalExpression(trim(parts[0]))); } // 辅助函数 bool Parser::startsWith(const string& str, const string& prefix) { return str.compare(0, prefix.length(), prefix) == 0; } size_t Parser::findMatchingBracket(const string& expr, size_t start) { int balance = 0; for (size_t i = start; i < expr.size(); ++i) { if (expr[i] == '(') balance++; else if (expr[i] == ')') balance--; else if (expr[i] == ',' && balance == 0) { return i; } } return string::npos; } string Parser::trim(const string& s) { size_t start = s.find_first_not_of(" \t\n\r"); size_t end = s.find_last_not_of(" \t\n\r"); return (start == string::npos) ? "" : s.substr(start, end - start + 1); } 带and的表达式该怎么写
最新发布
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值