Нужна помощь в создании образа из базы данных sqlite - PullRequest
0 голосов
/ 02 ноября 2011

Я пытаюсь создать образ из базы данных SQLite в приложении Java Swing.Но это показывает мне ошибки.Я использую JDK 1.6, Java 6, SQLite 3, sqlitejdbc-v056.jar для соединения SQLite и Ubuntu 11.04.Я получаю 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 ]

2 голосов
/ 02 ноября 2011

Ваша проблема в том, что ImageIO.read() не удается.Вероятно, это связано с этим кодом:

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

Никогда не используйте тип String для двоичных данных и никогда не используйте getBytes() - это зависит от кодировки по умолчанию вашей платформы.Это означает: он возьмет символы Unicode в строке и превратит их во все, что ваш компьютер считает хорошим.Это уничтожит ваши двоичные данные.

Правильное решение - использовать столбец BLOB.Посмотрите этот ответ, как писать с BLOB-объектами в sqlite: не может сохранить изображение как BLOB-объект в sqlite

Код для чтения аналогичен.

Если это не вариантзатем используйте кодировку ISO-8859-1, которая является отображением 1: 1, если у вас нет символов Unicode (что-либо с кодовой точкой> 255) в вашем String.

Не забудьте написатьнекоторые модульные тесты, чтобы убедиться, что ваш код работает.

1 голос
/ 02 ноября 2011

Используйте этот код для получения байтов:

Blob blob = pos.res.getBlob("photo");
bytes[] b = blob.getBytes(1, (int) blob.length());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...