我将数据放入数据库,它可以是MYSQL数据库(服务器)或SQLITE数据库(路上的平板电脑).Java应用程序每天与服务器同步,上传新数据并下载任何新数据.那部分运作良好.但是,要求它也能够处理图像.
我们选择在数据库中使用blob,而不是实现一个依赖于将图像复制到每端文件系统的全新系统.对那些不这样做的回复并不感兴趣;)我真正需要帮助的是当我尝试编写blob时,我在调度中得到一个异常.
我们正在从数据库构造输入表单,因为整个应用程序正在用于不同的目的,这取决于数据库.输入表单允许您将图像附加到记录,我们将其存储为base64字符串.然后将其解码为byte [].
我的测试程序在字符串和字节数组之间来回转换(最终是一个Image)没问题.所以我相信问题是在准备好的声明中设置Blob,但我可能是错的.
单击"保存"按钮后发生"异常".
Exception occurred during event dispatching: java.lang.AbstractMethodError: org.sqlite.PrepStmt.setBlob(ILjava/io/InputStream;J)V at tabletapp.database.DB.prepareStatement(DB.java:641) at tabletapp.database.DB.save(DB.java:743) at tabletapp.FormPanel.saveData(FormPanel.java:546)
违规代码块
public void prepareStatement(String table, String sql, LinkedHashMapdata) { try { String typeID = ""; PreparedStatement ps = connection.prepareStatement(sql); log.debug("Preparing SQL: " + sql.replace("\n", "")); int parameterIndex = 1; //for (String columnName : getColumnNames(table)) { for (String columnName : data.keySet()) { typeID = getColumnType(table, columnName); if (data.containsKey(columnName)) { String value = data.get(columnName); if (value == null || "".equals(value)) { //log.debug(columnName+":"+parameterIndex+" set to null"); ps.setNull(parameterIndex, Types.NULL); } else { //log.debug(columnName+":"+parameterIndex+" set to "+value); switch (getColumnTypeId(table, columnName)) { case Types.VARCHAR: case Types.CHAR: ps.setString(parameterIndex, value); break; case Types.TIMESTAMP: DateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date timstamp = new java.util.Date(); ps.setString(parameterIndex, timestampFormat.format(timstamp)); break; case Types.DATE: DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date date = new java.util.Date(); ps.setString(parameterIndex, dateFormat.format(date)); break; case Types.SMALLINT: case Types.INTEGER: case Types.NUMERIC: ps.setInt(parameterIndex, new Integer(value)); break; case Types.FLOAT: ps.setFloat(parameterIndex, new Float(value)); break; case Types.BLOB: // convert string to byte array to blob byte[] bData = null; try { bData = new BASE64Decoder().decodeBuffer(value); log.info("I have Bytes[]"); } catch (Exception e){ log.info("Something went Horribly, Horribly Wrong"); } // Note tried the follwowing //Blob blob=connection.createBlob(); // blob.setBytes(bData.length, bData); // ps.setBlob(parameterIndex,blob); ByteArrayInputStream bais = new ByteArrayInputStream(bData); ps.setBlob(parameterIndex, bais,bData.length); break; case Types.BOOLEAN: case Types.BIT: //log.debug(table + "." + columnName + " (boolean) = " + value); if ("1".equals(value) || "true".equals(value)) { ps.setBoolean(parameterIndex, true); } else { ps.setBoolean(parameterIndex, false); } break; } } parameterIndex++; } } ps.executeUpdate(); connection.commit(); } catch (SQLException e) { log.error("Error in sql: " + sql); e.printStackTrace(); } }
任何帮助非常感谢.
根据最近发布的Xerial组,方法setBlob没有在sqlite-jdbc中实现.对我来说,建议的替代方案
preparedStatement.setBytes(idx, data)
如果您的二进制数据足够小,可以作为字节数组加载到内存中,那么工作正常.