من همیشه با اینکه یک کار تکراری انجام بدم و یک Map Content Values درست کنم برای عملیاتهای Insert / Update برای جداول تو دیتابیسم حالم بد میشد تا اینکه این روش به ذهنم رسید امیدوارم به کارتون بیاد. البته برای دوستانی که از ORM های اندروید استفاده نمیکنند وگرنه که ORM ها خودشون همه کاری انجام میدن خیلی با برنامه نویس کاری ندارن.!
حالا چیکار میکنه فقط یک شی از جنس کلاس مدل دیتا تون را به این متد پاس بدید و خروجی همونطور که معلومه یک Content Values تحویل بگیرید دیگه کاری هم ندارید که اسم فیلد چی و مقدارش چی! والبته که کلاس مدل تون با جدول تون باید از نظر تعداد و نوع و نام فیلدها یکسان باشد.

این خط دستور هم من از کلاسهای خودم استفاد کردم. شما می تونید از کلاس TextUtils استفاده کنید.

identityFunction().equals


فقط یک نکته : چون من در جداولم از Byte Array برای تصاویر استفاده میکنم نام فیلدهاشون را دستی set میکنم بنا به دلایلی اگر شما چنین فیلدی ندارید میتونید اون قسمت را حذف کنید.!

private final String BOOLEAN = "boolean";
private final String INTEGER = "int";
private final String STRING = "java.lang.String";
private final String DOUBLE = "double";
private final String LONG = "long";
private final String SHORT = "short";
private final String BYTE = "byte";
private final String ABYTE = "[B";
private final String CHARACTER= "char" ;

public ContentValues setKeyAndValue(Object dataModelClass) {
ContentValues values = new ContentValues();

for (Field field : dataModelClass.getClass().getFields()) {
try {
field.setAccessible(true);
if (!identityFunction().equals(field.getName(),mSeria lVersionUid )) {
switch (field.getType().getName()) {
case BOOLEAN:
values.put(field.getName(), field.getBoolean(dataModelClass));
break;
case INTEGER:
values.put(field.getName(), field.getInt(dataModelClass));
break;
case STRING:
values.put(field.getName(), (String) field.get(dataModelClass));
break;
case DOUBLE:
values.put(field.getName(), field.getDouble(dataModelClass));
break;
case LONG:
values.put(field.getName(), field.getLong(dataModelClass));
break;
case SHORT:
values.put(field.getName(), field.getShort(dataModelClass));
break;
case BYTE:
values.put(field.getName(), field.getByte(dataModelClass));
break;
case ABYTE: // extracted byte[] field
if (dataModelClass instanceof SupplementModelDao) {
values.put(field.getName(), ((SupplementModelDao) dataModelClass).pathtestphoto);
} else {
if (dataModelClass instanceof ProfileinfoModelDao) {
switch (field.getName()) {
case KEY_PHOTOLOCAL:
values.put(field.getName(), ((ProfileinfoModelDao) dataModelClass).photolocal);
break;
case KEY_PHOTOLOCAL1:
values.put(field.getName(), ((ProfileinfoModelDao) dataModelClass).photolocal1);
break;
case KEY_PHOTOLOCAL2:
values.put(field.getName(), ((ProfileinfoModelDao) dataModelClass).photolocal2);
break;
}
} else {
if (dataModelClass instanceof CoachModelDao) {
values.put(field.getName(), ((CoachModelDao) dataModelClass).photo);
}
}
}
break;
case CHARACTER:
values.put(field.getName(), String.valueOf(field.getChar(dataModelClass)));
break;
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return values;
}