有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何从java转换。util。HashMap到安卓。所容纳之物内容价值观?

有没有一种简单的方法可以将java Map<String,Object>转换为安卓.content.ContentValues

安卓.content.ContentValues在安卓数据库编程中用于将数据库行的数据保持为名称-值对

背景:

我尝试将现有安卓应用程序的业务逻辑移植到j2se swing应用程序

我的目标是拥有特定于安卓的代码 以及安卓独立代码,该代码进入一个单独的库,可供安卓和swing gui使用

目前我正在分析

  • 如果我必须用大量冗余代码实现一整套独立的Repository实现
  • 或者,如果有通用代码可以在(j2se swing和安卓)存储库实现中使用

存储库数据库代码依赖于使用安卓.content.ContentValues的数据库字段名-值对

我认为我的安卓独立版本可以使用HashMap<String,Object>插入ContentValues并创建代码在两者之间进行转换

依赖安卓的版本会是这样的

    // 安卓 dependant code in 安卓-app
    class AndroidTimeSliceCategoryRepsitory implements ICategoryRepsitory {

        public long createTimeSliceCategory(final TimeSliceCategory category) {

            // get values from 安卓 independant layer
            Map<String, Object> columsToBeInserted = TimeSliceCategorySql.asHashMap(category);

// >>>> this is where i am stuck
            ContentValues 安卓ColumsToBeInserted = DbUtils.asContentValues(columsToBeInserted);

            final long newID = AndroidTimeSliceCategoryRepsitory.DB.getWritableDatabase()
                    .insert(TimeSliceCategorySql.TIME_SLICE_CATEGORY_TABLE, null, 安卓ColumsToBeInserted);
            category.setRowId((int) newID);
            return newID;
        }
    }

这是安卓独立部分:

    // 安卓 independant code in common jar
    class TimeSliceCategorySql {....

        /** converts {@link ....model.TimeSliceCategory}  to {@link java.util.HashMap} */
        public static Map<String, Object> asHashMap(final TimeSliceCategory category) {
            final Map<String, Object> values = new HashMap<String, Object>();
            values.put(TimeSliceCategorySql.COL_CATEGORY_NAME,
                    category.getCategoryName());
            values.put(TimeSliceCategorySql.COL_DESCRIPTION,
                    category.getDescription());

            // ... more values

            return values;
        }
    }

目前我被困在这里:

    public class AndroidDatabaseUtil {
        /** converts from 安卓 independeant {@link java.util.Map} to 安卓 dependent {@link 安卓.content.ContentValues} */
        public static ContentValues toContentValues(Map<String, Object> src) {
            ContentValues result = new ContentValues();

            for (String name : src.keySet()) {

// this is not possible because ContentValues does not define put(String name, Object value)
                result.put(name, src.get(name));

// using this would loose ContentValues.getAsLong() throw exception.
// result.put(name, src.get(name).toString());

            }
            src.entrySet()
            return result;
        }
    }

共 (2) 个答案

  1. # 1 楼答案

    看起来你在地图中输入的值是字符串

    因此,可以将地图的定义更改为

    final Map<String, String> values = new HashMap<String, String>();
    

    这将允许您在ContentValues实例中放置值:

    result.put(name, src.get(name));
    
  2. # 2 楼答案

    可以在if语句中使用instanceof关键字对其进行筛选

    例如:

    if( src.get(name) instanceof String){
      // convert to string
    }
    

    也可以从对象中使用getClass方法:

    对象ob=src。获得(姓名)

      if(ob instanceof ob.getClass()){
       // convert to type
      }