以下代码是我用来更新数据库中某些字段值的代码
public void updatesomeField(String registrationID) {
ContentValues objValues;
try {
objDatabase=this.getWritableDatabase();
objValues = new ContentValues();
objValues.put(COLUMN_REGISTRATION_ID,registrationID);
objDatabase.update(CUSTOMER_USERS_TABLE_NAME, objValues,null,null);
objDatabase.close();
} catch(Exception errorException) {
Log.d("error",""+ errorException);
}
}
然后我决定使用通用方法,因此编写了上面的代码,如
public <T> void update(String tableName, String columnName, T value) {
ContentValues objValues;
try {
objDatabase=this.getWritableDatabase();
objValues = new ContentValues();
objValues.put(columnName,value); ///here comes the error BECAUSE THE 'value'
objDatabase.update(tableName, objValues,null,null);
objDatabase.close();
} catch(Exception errorException) {
Log.d("error",""+ errorException);
}
}
错误是因为ContentValues
是final
而我无法扩展它以创建我自己的新类来存储我的通用变量类型。应该执行哪些优化,以便通过使用相同的代码来消除错误?
我有一个最终的预定义类ContentValues
,其方法是以键和值的形式获取参数。
但是我想实现一个通用的功能,并希望在运行时决定它应该是什么类型的值
答案 0 :(得分:1)
你可以写一个Adapter为你做调度:
class ContentValuesAdapter {
private ContentValues values;
public ContentValuesAdapter(ContentValues values) {
this.values = values;
}
public void put(String columnName, Object value) {
if(value instanceof String) {
values.put(columnName, (String) value);
} else if ( ... ) {
...
}
}
public ContentValues getContentValues() {
return this.values;
}
/* Delegate all other methods to the ContentValue instance. */
}
现在您可以使用此类而不是原始类,并保持使用代码清洁。
答案 1 :(得分:1)
我在整个应用程序中使用泛型类型,并且必须说确定对象类型的最简单(可能不是最好或最有效)方法之一是instanceof
- 例如:
if(obj instanceof SiteContact){
buildContactDropdownList((SiteContact)obj);
}else if(obj instanceof Delivery){
buildDeliveryList((Delivery)obj);
}
你也可以很容易地把它包装在帮助器类中。
答案 2 :(得分:0)
如果ContentValues
类属于第三方库并且您无法访问其源代码,那么我担心您会坚持使用它。
显然,ContentValues
包含put(String,String)
方法。您可以做的是调用toString()
的{{1}}方法:
value
由于objValues.put(columnName, value.toString());
方法已经在班级toString()
中定义,因此您不需要使用泛型。所以你可以打电话给你的方法:
Object