我一直在尝试使用像
这样的参数进行更新 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);";
答案 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))