2015-10-06 111 views
2

我使用以下代码从SQLite数据库检索数据。数据库的第4列存储字符串为BLOB。现在我需要返回字符串值。但Blob blob = exe.getBlob("col_4");给了我一个例外not implemented by SQLite JDBC driver。我该如何解决这个问题?无法将blob转换为字符串,SQLite + java

Connection c = null; 
Statement stm = null; 

String db = "C:\\Users\\Asus™\\Desktop\\New folder (2)\\tempo.db"; 
try { 
    Class.forName("org.sqlite.JDBC"); 
    c = DriverManager.getConnection("jdbc:sqlite:" + db); 
    c.setAutoCommit(false); 

    System.out.println("DB opened successfully !"); 

    stm = c.createStatement(); 
    int rc = 0; 
    try (ResultSet exe = stm.executeQuery("SELECT * FROM tblTest;")) { 
     while (exe.next()) { 
      Blob blob = exe.getBlob("col_4"); 
      String password = new String(blob.getBytes(1, (int) blob.length())); 

      System.out.println(password 
        + exe.getString("col_1") + "\t" 
        + exe.getString("col_2") + "\t" 
        + exe.getString("col_3") + "\t" 
        + password 
      ); 
      rc++; 
     } 
     System.out.println(rc++); 
    } 
    stm.close(); 
} catch (ClassNotFoundException ex) { 
    Logger.getLogger(SQLiteBrowser.class.getName()).log(Level.SEVERE, null, ex); 
} catch (SQLException ex) { 
    Logger.getLogger(SQLiteBrowser.class.getName()).log(Level.SEVERE, null, ex); 

}

例外:

java.sql.SQLException: not implemented by SQLite JDBC driver 
     at org.sqlite.jdbc4.JDBC4ResultSet.unused(JDBC4ResultSet.java:320) 
     at org.sqlite.jdbc4.JDBC4ResultSet.getBlob(JDBC4ResultSet.java:345) 
     at sqlite.SQLiteBrowser.jButton1ActionPerformed(SQLiteBrowser.java:256) 
     at sqlite.SQLiteBrowser.access$000(SQLiteBrowser.java:29) 
     at sqlite.SQLiteBrowser$1.actionPerformed(SQLiteBrowser.java:76) 
     at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
     at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) 
     at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
     at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
     at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
     at java.awt.Component.processMouseEvent(Component.java:6525) 
     at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
+2

您为什么认为密码字段未加密? –

回答

0

看来,这个JDBC库im不支持ResultSet#getBlob方法(由于sources,JDBC4ResultSet没有实现它)。您可以尝试使用ResultSet#getBytes代替:

byte[] bytes = exe.getBytes("col_4"); 
String password = new String(bytes); 
+0

'String password = new String(bytes);'返回无法识别的字符。如'Ќ z'。 – ccc

+1

您可以尝试创建一个blob,并尝试将其转换为字符串Blob blob = c.createBlob(); blob.setBytes(1,bytes);但不知道它有帮助,尝试检查编码可能 – Stanislav

0

getBlob()方法不supportedby SQLite的...但斑点的支持......你需要使用getBytes

byte[] bytes = exe.getBytes("col_4"); 
+0

我怎样才能以正确的格式(不是无法识别的字符,'Ќ z。 - ')获取字符串为'字符串'? – ccc

+0

有点像'String str = new String(bytes,“UTF-8”);'...或者使用apache commons库:'String str = IOUtils.toString(inputStream,“UTF-8”);' – Pras