首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >参数化UPDATE不修改任何行

参数化UPDATE不修改任何行
EN

Stack Overflow用户
提问于 2014-07-11 15:42:54
回答 2查看 53关注 0票数 0

我一直在尝试使用这样的参数进行更新

String whereClause = KEY_FIELD_CODE + “= ?” String whereArgs[] ={“123456″}

但是,即使存在与字段匹配的行,也不能只更新0行。但当我像这样设置update语句时,结果会发生变化:

String whereClause = KEY_FIELD_CODE + “= 123456″ String whereArgs[] =null

有人知道为什么会发生这种情况吗?在哪些情况下会发生这种情况?最重要的是如何解决这个问题。注意:在此表中,我使用FTS3进行全文搜索。我知道使用参数化查询的重要性,我想使用它,而不是连接参数。

谢谢

代码语言:javascript
运行
复制
for(Customer client : clients){

            Log.v(TAG, "Preparing..........");
            values = new ContentValues();
            values.put(FData.KEY_CLIENT_CODE,   client.getCode());
            values.put(FData.KEY_CLIENT_ZONE,   client.getZone());
            values.put(FData.KEY_CLIENT_NAME,   client.getName());
            values.put(FData.KEY_CLIENT_CREDIT, client.getCredit());
            values.put(FData.KEY_CLIENT_ESTATE, client.getEstate());
            values.put(FData.KEY_CLIENT_ENTRY,  client.getEntry());

            uri = ContentUris.withAppendedId(CPFertica.CLIENTS_URI, client.getCode());
            if(exists(uri)){
                Log.v(TAG, "Updating..........");
                values.remove(FData.KEY_CLIENT_CODE);
                String[] whereArgs = new String[]{client.getCode()+""};
                String whereClause = FData.KEY_CLIENT_CODE + "=" + client.getCode();
                _contentResolver.update(uri, values, whereClause, null);
            }else{
                Log.v(TAG, "Inserting..........");
                _contentResolver.insert(uri, values);
            }

表结构

private static final String DATABASE_CREATE_TABLE_CLIENTS = "CREATE VIRTUAL TABLE " + DB_TABLE_CLIENTS + " USING fts3 ( "+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_CLIENT_CODE + " INTEGER UNIQUE, " + KEY_CLIENT_ZONE + " TEXT, " + KEY_CLIENT_NAME + " TEXT, " + KEY_CLIENT_ESTATE + " TEXT, " + KEY_CLIENT_CREDIT + " TEXT, " + KEY_CLIENT_TAX + " TEXT, " + KEY_CLIENT_ENTRY + " TEXT, " + KEY_CLIENT_PRICE + " TEXT);";

EN

回答 2

Stack Overflow用户

发布于 2014-07-12 15:55:37

在虚拟表中,affinities不一定像在普通表中那样工作。INTEGER列中的值被作为数字进行比较,因此字符串"123456"永远不会与它们中的任何一个进行相等的比较。

whereArgs仅适用于字符串。(这是Android数据库API的设计错误。)使用整数时,将它们直接插入到SQL字符串中。

请注意,FTS表将其所有列存储为纯字符串;主键、AUTOINCREMENT和UNIQUE将被忽略(如果不使用FTS查找,则代码列的查找速度会很慢)。如果您希望有一个(自动递增)数字ID列,则必须使用internal rowid column

票数 1
EN

Stack Overflow用户

发布于 2014-07-11 15:49:08

尝试使用replace语句,如果新行不存在,则会将其添加到数据库中,否则将更新该行。

代码语言:javascript
运行
复制
ContentValues values = new ContentValues();
        values.put(DBUtils.KEY_ID, data.getDoctorId());
        values.put(DBUtils.KEY_FIRST_NAME, data.getFirstName());
        values.put(DBUtils.KEY_LAST_NAME, data.getLastName());
        count = db.replace(DBUtils.TABLE_USER, null, values);

或者试试这玩意

where子句==> DBUtils.KEY_ID + "=?“其中arges ==> String[] { String.valueOf(id))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24692520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档