2011-11-02 83 views
0

我想從Java Swing應用程序中的SQLite數據庫創建圖像。但它顯示了我的錯誤。我使用JDK 1.6,Java 6,SQLite 3,sqlitejdbc-v056.jar來連接SQLite和Ubuntu 11.04。我從here得到sqlite連接器。下面是我的代碼:需要幫助從sqlite數據庫創建圖像

pos.res = pos.statement.executeQuery("select * from customer where card_id = "+card_id+";"); 

      while(pos.res.next()){ 
       if(pos.defaultParams != null){ 
        pos.defaultParams.remove("pricelist_id"); 
       }else{ 
        pos.defaultParams = new HashMap<String, Object>(); 
       } 
       pos.defaultParams.put("pricelist_id", pos.res.getString("pricelist")); 
       pos.jTextPane6.setText(pos.res.getString("name").toString()); 
       pos.customderId = Integer.parseInt(pos.res.getString("customer_id")); 
       pos.jTextPane7.setText(pos.res.getString("department").toString()); 
       byte[] byt = pos.res.getString("photo").toString().getBytes(); 
       InputStream in = new ByteArrayInputStream(byt); 
       BufferedImage image = ImageIO.read(in); 
       ImageIO.write(image, "jpg",new File("/home/foo/Desktop/jj.jpg")); 
       Graphics2D g = (Graphics2D)pos.jPanel4.getGraphics(); 
       g.drawImage(resize(image, 111, 100), null, 0, 0); 
      } 


private static BufferedImage resize(BufferedImage image, int width, int height) { 
     BufferedImage resizedImage = new BufferedImage(width, height, 
     BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g = resizedImage.createGraphics(); 
     g.drawImage(image, 0, 0, width, height, null); 
     g.dispose(); 
     return resizedImage; 
    } 

我獲得以下錯誤:

Nov 2, 2011 4:12:04 PM pointofsale.setCustomer set 
SEVERE: null 
java.lang.IllegalArgumentException: image == null! 
1819 [AWT-EventQueue-0] DEBUG pointofsale.PointOfSaleView - endting setCustomer.set func 
    at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:1038) 
    at javax.imageio.ImageIO.getWriter(ImageIO.java:1581) 
    at javax.imageio.ImageIO.write(ImageIO.java:1510) 
    at pointofsale.setCustomer.set(setCustomer.java:65) 
    at pointofsale.PointOfSaleView.focusGained(PointOfSaleView.java:1032) 
    at java.awt.AWTEventMulticaster.focusGained(AWTEventMulticaster.java:220) 
    at java.awt.Component.processFocusEvent(Component.java:6092) 
    at java.awt.Component.processEvent(Component.java:5959) 
    at java.awt.Container.processEvent(Container.java:2105) 
    at java.awt.Component.dispatchEventImpl(Component.java:4564) 
    at java.awt.Container.dispatchEventImpl(Container.java:2163) 
    at java.awt.Component.dispatchEvent(Component.java:4390) 
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1881) 
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:936) 
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:551) 
    at java.awt.Component.dispatchEventImpl(Component.java:4434) 
    at java.awt.Container.dispatchEventImpl(Container.java:2163) 
    at java.awt.Component.dispatchEvent(Component.java:4390) 
    at sun.awt.X11.XWindow$1.run(XWindow.java:378) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:647) 
    at java.awt.EventQueue.access$000(EventQueue.java:96) 
    at java.awt.EventQueue$1.run(EventQueue.java:608) 
    at java.awt.EventQueue$1.run(EventQueue.java:606) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:617) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) 

請幫幫我嗎?

回答

2

您的問題是ImageIO.read()失敗。這可能是由於此代碼:

pos.res.getString("photo").toString().getBytes(); 

切勿使用類型String的二進制數據,並永遠不會使用getBytes() - 這取決於你的平臺默認的編碼。這意味着:它將採用字符串中的Unicode字符,並將它們轉換爲任何您的計算機認爲的好。這會破壞你的二進制數據。

正確的解決方案是使用BLOB列。看到這個答案如何寫BLOBs到sqlite:cannot save image as blob to sqlite

閱讀代碼是相似的。

如果這不是一個選項,那麼如果String中沒有Unicode字符(代碼點> 255的任何東西),則使用編碼爲ISO-8859-1的編碼爲1:1映射。

不要忘了寫一些單元測試,以確保您的代碼工作。

+0

Wooow。非常感謝你。它解決了我的問題。你拯救我的一天。 – Zeck

1

使用此代碼來獲取字節:

Blob blob = pos.res.getBlob("photo"); 
bytes[] b = blob.getBytes(1, (int) blob.length()); 
+0

嗨,哥們。當我嘗試你的代碼時,我得到'java.sql.SQLException:沒有通過SQLite JDBC驅動程序實現'的錯誤。任何想法? – Zeck