参数化UPDATE DON&T; T修改任何行

时间:2014-07-11 07:42:54

标签: android sqlite android-contentprovider parameterized

我一直在尝试使用像

这样的参数进行更新

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

但即使与该字段匹配的行存在,也无法更新0行。但是当我像这样设置更新语句时结果会改变:

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

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

由于

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);";

2 个答案:

答案 0 :(得分:1)

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

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

请注意,FTS表将所有列存储为纯字符串;忽略PRIMARY KEY,AUTOINCREMENT和UNIQUE(如果不使用FTS查找,代码列上的查找会很慢)。 如果您想拥有(自动增量)数字ID列,则必须使用internal rowid column

答案 1 :(得分:0)

尝试使用替换语句,如果它不存在,它会向db添加新行,否则更新该行。

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 clause ==> DBUtils.KEY_ID +“=?” 其中arges ==> new String [] {String.valueOf(id))