代码之家  ›  专栏  ›  技术社区  ›  gc5

java.lang.ClassCastException:无法将java.lang.String转换为java.lang.Boolean,使用Table.addRow()和Jackcess

  •  5
  • gc5  · 技术社区  · 11 年前

    我正在尝试使用Jackcess在MS Access数据库中写入一些值。我的值最初使用String表示。我使用的代码如下:

    int nColumns = 0;
    
    // get table from internal representation
    ModelDatabaseTable table = this.DB.getTable(tableName);
    
    // create new table
    TableBuilder DBTableBuilder = new TableBuilder(tableName);
    
    // get table's columns and their Jackcess datatype    
    Map<String, DataType> columns = table.getColumns();
    
    // for each column, insert it in the actual database
    for (String columnName : columns.keySet()) {
        DataType dt = columns.get(columnName);
        ColumnBuilder cb = new ColumnBuilder(columnName).setType(dt);
        if (dt.isVariableLength()) {
            cb.setMaxLength();
        }
        DBTableBuilder.addColumn(cb);
        nColumns += 1;
    }
    
    // if columns were inserted
    if (nColumns > 0) {
        // write table to actual database
        Table DBTable = DBTableBuilder.toTable(this.DBConnection);
    
        // for each row
        for (ModelDatabaseRow row : table.getRows()) {
    
            // get list of values (represented using String)
            List<String> values = new ArrayList<String>();
    
            // for each column get its value and insert it in values
            for (String columnName : columns.keySet()) {
                String columnValue = row.getColumn(columnName);
                values.add(columnValue);
            }
    
            // print current row
            System.out.println(values.toString());
    
            // insert row in database table. Exception rises here:
            // java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
            DBTable.addRow(values.toArray());
        }
    }
    

    下面是一个不起作用的基本示例(使用JSON描述例程数据)。在这种情况下,当尝试插入BOOLEAN值时,例程停止( HasM , HasZ )但它可以插入DOUBLE值-这些值都作为参数提供给 Table.addRow() 函数作为字符串数组。

    {
      "tables": {
        "Table1": {
          "rows": [
          {
            "items": {
            "ExtentBottom": "45.050715999999994",
            "ExtentLeft": "7.644834000000003",
            "ExtentRight": "7.670400999999998",
            "ExtentTop": "45.07392899999999",
            "FieldName": "Shape",
            "HasM": "false",
            "HasZ": "false",
            "IdxGridSize": "3.7252903001966386E-7",
            "IdxOriginX": "0.0",
            "IdxOriginY": "0.0",
            "MHigh": "NaN",
            "MLow": "NaN",
            "SRID": "1",
            "ShapeType": "4",
            "TableName": "GDB_Items",
            "ZHigh": "NaN",
            "ZLow": "NaN"
            }
          },
          {
            "items": {
            "ExtentBottom": "4989476.8181",
            "ExtentLeft": "393329.1171000004",
            "ExtentRight": "395300.25320000015",
            "ExtentTop": "4992023.569399999",
            "FieldName": "Shape",
            "HasM": "false",
            "HasZ": "false",
            "IdxGridSize": "0.009311329524584121",
            "IdxOriginX": "0.0",
            "IdxOriginY": "0.0",
            "MHigh": "NaN",
            "MLow": "NaN",
            "SRID": "2",
            "ShapeType": "4",
            "TableName": "Building_DIMMER_01",
            "ZHigh": "NaN",
            "ZLow": "NaN"
            }
          }
          ],
          "columns": {
          "ExtentBottom": "DOUBLE",
          "ExtentLeft": "DOUBLE",
          "ExtentRight": "DOUBLE",
          "ExtentTop": "DOUBLE",
          "FieldName": "TEXT",
          "HasM": "BOOLEAN",
          "HasZ": "BOOLEAN",
          "IdxGridSize": "DOUBLE",
          "IdxOriginX": "DOUBLE",
          "IdxOriginY": "DOUBLE",
          "MHigh": "DOUBLE",
          "MLow": "DOUBLE",
          "SRID": "LONG",
          "ShapeType": "LONG",
          "TableName": "TEXT",
          "ZHigh": "DOUBLE",
          "ZLow": "DOUBLE"
          } 
        }
      }
    }
    

    前面的JSON表示程序使用的数据的内部表示,其结构如下:

    {
      "tables": {
        "TableName": {
          "rows": [
            {
              "items: {
                "columnName1": "columnValue1",
                ...
                "columnNameN": "columnValueN"
               }
            },
            {
              "items: {
                "columnName1": "columnValue1",
                ...
                "columnNameN": "columnValueN"
               }
            }
          ],
          "columns": {
            "columnName1": "columnDataType1",
            ...
            "columnNameN": "columnDataTypeN"
          }
        }
      }
    }
    

    如果不清楚,请问我:,

    谢谢

    3 回复  |  直到 11 年前
        1
  •  4
  •   Gord Thompson    10 年前

    Jackcess通常希望使用强类型Java对象。在这种情况下,Jackcess必须通过自动转换 String Double 添加行时。无论出于什么原因,Jackcess 愿意自动转换 一串 Boolean * ,即使这种转换看起来很明显(对我们来说),所以对于具有字段的表

    ID:自动编号,主键
    双字段:数字(双)
    是否字段:是/否

    以下代码将引发您看到的异常

    String doubleFieldValue = "3.14159";
    String yesnoFieldValue = "true";
    tbl.addRow(Column.AUTO_NUMBER, doubleFieldValue, yesnoFieldValue);
    

    不过,这会奏效的

    String doubleFieldValue = "3.14159";
    String yesnoFieldValue = "true";
    tbl.addRow(Column.AUTO_NUMBER, doubleFieldValue, Boolean.parseBoolean(yesnoFieldValue));
    

    作为一般规则,在使用Jackcess时,最好尝试使用正确类型的对象,以避免类似这样的小“意外”,因此根据权利,我们确实应该使用

    String doubleFieldValue = "3.14159";
    String yesnoFieldValue = "true";
    tbl.addRow(Column.AUTO_NUMBER, Double.parseDouble(doubleFieldValue), Boolean.parseBoolean(yesnoFieldValue));
    

    * 编辑:2015-03-21

    自动转换 一串 值到 布尔型 已添加到今天发布的Jackcess 2.0.9中。

        2
  •  1
  •   Noor Hossain    4 年前

    对于SharedPreferences,在SharedPreferences中对布尔值和字符串使用相同的关键字会出现此异常,这里是我的 Details Answer.

        3
  •  0
  •   Bryan Devaney    11 年前

    在线:

    List<String> values = new ArrayList<String>();
    

    您特别指定希望值仅包含String对象, 如果要插入布尔值,则需要更通用的对象声明。

    List<Object> values = new ArrayList<Object>();
    

    尽管您可能会丢失一些所需的字符串功能。

    推荐文章