Note that there are some explanatory texts on larger screens.

plurals
  1. POERROR java.sql.SQLException: near "-": syntax error
    text
    copied!<p>I am developing a Java tools to convert StarDict database to SQLite database for use with an Android Dictionary app. But I get the following error:</p> <pre><code>java.sql.SQLException: near "-": syntax error at org.sqlite.DB.throwex(DB.java:288) at org.sqlite.NativeDB.prepare(Native Method) at org.sqlite.DB.prepare(DB.java:114) at org.sqlite.Stmt.executeUpdate(Stmt.java:102) at com.trivisionsc.ConvertData.createData(ConvertData.java:353) at com.trivisionsc.ConvertData.excuteConvert(ConvertData.java:314) at com.trivisionsc.ConvertData$1.actionPerformed(ConvertData.java:116) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) </code></pre> <p>And here is the source: </p> <pre><code>package com.trivisionsc; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Image; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.WindowConstants; public class ConvertData extends JFrame { // Variables declaration int count=0; private static final long serialVersionUID = 1L; private JLabel lblIndexFilePath; private JLabel lblDictFilePath; private JLabel lblDisplayProcess; private JTextField txtSourceFilePath; private JTextField txtDbFilePath; private JButton btnPerform; private JButton btnStop; private JButton btnIndexFileSelect; private JButton btnDictFileSelect; private JPanel contentPane; private JFileChooser fc; private String messageResult; private int start; private int countWord; private int numberWord; int result; boolean stop; // End of variables declaration public ConvertData() { super(); createLayout(); this.setVisible(true); } private void createLayout() { // Initialize lblIndexFilePath = new JLabel(); lblDictFilePath = new JLabel(); lblDisplayProcess= new JLabel(); txtSourceFilePath = new JTextField(); txtDbFilePath = new JTextField(); btnPerform = new JButton(); btnStop=new JButton(); btnIndexFileSelect=new JButton(); btnDictFileSelect=new JButton(); contentPane = (JPanel)this.getContentPane(); fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); //lblDisplayProcess lblDisplayProcess.setForeground(new Color(255, 0, 0)); lblDisplayProcess.setHorizontalAlignment(SwingConstants.LEFT); //lblIndexFilePath lblDictFilePath.setHorizontalAlignment(SwingConstants.LEFT); lblIndexFilePath.setText(" Path store source dict"); //lblDictFilePath lblDictFilePath.setHorizontalAlignment(SwingConstants.LEFT); lblDictFilePath.setText(" Path store database"); // txtSourceFilePath txtSourceFilePath.setForeground(new Color(0, 0, 255)); txtSourceFilePath.setToolTipText("Enter path store source dict"); // txtDbFilePath txtDbFilePath.setForeground(new Color(0, 0, 255)); txtDbFilePath.setToolTipText("Enter path store database"); // btnPerform btnPerform.setText("Convert"); btnPerform.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { //insert database excuteConvert(); } }); // btnStop btnStop.setText("Stop"); btnStop.setEnabled(false); btnStop.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { stop=true; } }); // btnIndexFileSelect btnIndexFileSelect.setText("Browser..."); btnIndexFileSelect.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { int returnVal = fc.showOpenDialog(ConvertData.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); txtSourceFilePath.setText(file.getAbsolutePath()); } } }); // btnDictFileSelect btnDictFileSelect.setText("Browser..."); btnDictFileSelect.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { int returnVal = fc.showOpenDialog(ConvertData.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); txtDbFilePath.setText(file.getAbsolutePath()); } } }); // contentPane contentPane.setLayout(null); contentPane.setBorder(BorderFactory.createEtchedBorder()); // add component for Frame addComponent(contentPane, lblIndexFilePath, 35,10,126,18); addComponent(contentPane, lblDictFilePath, 35,47,126,18); addComponent(contentPane, txtSourceFilePath, 160,10,203,22); addComponent(contentPane, btnIndexFileSelect, 365,9,80,25); addComponent(contentPane, txtDbFilePath, 160,45,203,22); addComponent(contentPane, btnDictFileSelect, 365,44,80,25); addComponent(contentPane, btnPerform, 160,75,90,30); addComponent(contentPane, btnStop, 250,75,90,30); addComponent(contentPane, lblDisplayProcess, 35,110,250,18); //set title for program this.setTitle("Convert data for TDict"); // set icon for program ImageIcon receivedIcon = new ImageIcon("resource\\images\\tri.png"); Image logoImg=receivedIcon.getImage(); this.setIconImage(logoImg); //set position display this.setLocation(new Point(400, 300)); //set size display this.setSize(new Dimension(500, 200)); //set event close window this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //set disable resize this.setResizable(false); } /** Add Component Without a Layout Manager (Absolute Positioning) */ private void addComponent(Container container,Component c,int x,int y,int width,int height) { c.setBounds(x,y,width,height); container.add(c); } public void excuteConvert() { //set empty for display result run lblDisplayProcess.setText(""); //name dictionary String dictName=null; // path to file String sourceStorePath=txtSourceFilePath.getText(); String dbStorePath=txtDbFilePath.getText(); // path file source dictionary don't exits File directorySource = new File(sourceStorePath); // path file source dictionary don't exits if (sourceStorePath==null || sourceStorePath.equals("")||!directorySource.exists()) { JOptionPane.showMessageDialog(ConvertData.this,"Path is invalid!","Error",JOptionPane.ERROR_MESSAGE,null); txtSourceFilePath.requestFocus(); return; } // path file database don't exits File directoryDb = new File(dbStorePath); if (dbStorePath==null || dbStorePath.equals("")||!directoryDb.exists()) { JOptionPane.showMessageDialog(ConvertData.this,"Path is invalid!","Error",JOptionPane.ERROR_MESSAGE,null); txtDbFilePath.requestFocus(); return; } // check in source directory include: file index,dictionary and information? File[] files = directorySource.listFiles(); int check=0; if (files.length&gt;0) { for (int i = 0; i &lt; files.length; i++) { if(files[i].getName().endsWith(".idx")) { check++; dictName=files[i].getName().replaceAll(".idx", ""); } if(files[i].getName().endsWith(".dict")) check++; if(files[i].getName().endsWith(".ifo")) check++; } } else { // Folder don't include any file JOptionPane.showMessageDialog(ConvertData.this,"Source directory have to include files: .idx,.dict and .ifo","Error",JOptionPane.ERROR_MESSAGE,null); txtSourceFilePath.requestFocus(); return; } if(check&lt;3) { // Folder don't include full file JOptionPane.showMessageDialog(ConvertData.this,"Source directory have to include files: .idx,.dict and .ifo","Error",JOptionPane.ERROR_MESSAGE,null); txtSourceFilePath.requestFocus(); return; } // path file information String infoFilePath=sourceStorePath+"\\"+dictName+".ifo"; // path file index String indexFilePath=sourceStorePath+"\\"+dictName+".idx"; //path file content String dataFilePath=sourceStorePath+"\\"+dictName+".dict"; // read file information to get max size file index int idxFileSize=0; try { // open stream read file FileInputStream fstream=new FileInputStream(infoFilePath); DataInputStream in = new DataInputStream(fstream); BufferedReader input = new BufferedReader (new InputStreamReader(in)); String strLine; int k=0; //Read File Line By Line while ((strLine = input.readLine()) != null) { if (strLine.contains("idxfilesize=")) { String valueStr=strLine.replaceAll("idxfilesize=", ""); idxFileSize = Integer.parseInt(valueStr.trim()); k++; } if (strLine.contains("wordcount=")) { String valueStr=strLine.replaceAll("wordcount=", ""); numberWord = Integer.parseInt(valueStr.trim()); k++; } if(k&gt;1) break; } //Close the input stream input.close(); } catch(Exception e) { JOptionPane.showMessageDialog(ConvertData.this,"System error!Please try again","Error",JOptionPane.ERROR_MESSAGE,null); setActive(); return; } // perform convert this.createData(dbStorePath,indexFilePath,dataFilePath,idxFileSize,dictName); } @SuppressWarnings("deprecation") public void createData(String dbStorePath,String indexFilePath,String dataFilePath,int idxFileSize,String dictName){ // Open connect database SQLite try { File checkFile = new File(dbStorePath+"\\"+dictName+".db"); if (checkFile.exists()) { result =JOptionPane.showConfirmDialog((ConvertData.this), "Are you sure to overwrite?", "File existed!", JOptionPane.YES_NO_OPTION); if (result==1) { setActive(); return; } else { boolean isDeleteSuccess=checkFile.delete(); if (!isDeleteSuccess) { JOptionPane.showMessageDialog(ConvertData.this,"Delete file unsuccessfully. Please restart program. ","Error",JOptionPane.ERROR_MESSAGE,null); setActive(); return; } } } //Disable controls before insert database setUnActive(); Class.forName("org.sqlite.JDBC"); Connection conn = DriverManager.getConnection("jdbc:sqlite:"+dbStorePath+"\\"+dictName+".db"); final Statement st = conn.createStatement(); // Create table and index st.executeUpdate("CREATE TABLE IF NOT EXISTS "+dictName+"(Word TEXT NOT NULL PRIMARY KEY, Content TEXT,Id INTEGER NOT NULL);"); st.executeUpdate("CREATE INDEX wrod_idx ON "+dictName+"(Id);"); // Read file FileInputStream fileIndex=new FileInputStream(indexFilePath); final BufferedInputStream input = new BufferedInputStream(fileIndex); // File content FileInputStream fileDict=new FileInputStream(dataFilePath); final BufferedInputStream dictInput = new BufferedInputStream(fileDict); // Array store data read form File index final byte[] data = new byte[idxFileSize]; input.read(data); final String dictionName=dictName; countWord=0; // Read data new Thread(new Runnable() { public void run() { for (int i=0; i &lt; data.length; i++) { if (data[i] == '\0') { try { //Read data form index int lengthOfData = i - start; byte[] tmp = new byte[lengthOfData]; System.arraycopy(data, start, tmp, 0, lengthOfData); int length = byteArrayToInt(data, i+5); //Word String word = new String(tmp, "UTF-8"); //Read content from file data byte[] value = new byte[length]; dictInput.read(value); //Content String content = new String(value,"UTF-8"); i += 9; start = i; // insert into database st.executeUpdate("INSERT INTO "+dictionName+"(Word,Content,Id) VALUES ('"+Utility.encodeContent(word)+"','"+Utility.encodeContent(content)+"',"+countWord+")"); messageResult="Executing .... Insert element "+countWord+"/"+numberWord; countWord++; if (stop) { setActive(); messageResult="Cancel"; i=data.length; st.close(); } } catch(Exception e) { ; } SwingUtilities.invokeLater( new Runnable() { public void run() { lblDisplayProcess.setText(messageResult); } } ); try { Thread.sleep(1); } catch(Exception e) { JOptionPane.showMessageDialog(ConvertData.this,"System error!Please try again","Error",JOptionPane.ERROR_MESSAGE,null); setActive(); return; } } } try { if(!stop&amp;&amp;countWord==numberWord) { setActive(); lblDisplayProcess.setText("Completed! "); st.close(); } } catch(Exception e) { JOptionPane.showMessageDialog(ConvertData.this,"System error!Please try again","Error",JOptionPane.ERROR_MESSAGE,null); setActive(); return; } /// } }).start(); }catch(Exception e) { JOptionPane.showMessageDialog(ConvertData.this,"System error!Please try again","Error",JOptionPane.ERROR_MESSAGE,null); setActive(); return; } } //method to calculate value of byteArray public static int byteArrayToInt(byte[] b, int offset) { int value = 0; for (int i = 0; i &lt; 4; i++) { int shift = (4 - 1 - i) * 8; value += (b[i + offset] &amp; 0x000000FF) &lt;&lt; shift; } return value; } public void updateControl() throws Throwable { for (int i=0; i&lt;100; i++) { System.out.println("thread " +Thread.currentThread().getName()+" step "+i); Thread.sleep(500); } } public final void setActive() { //set for control enable txtDbFilePath.setEnabled(true); txtSourceFilePath.setEnabled(true); btnIndexFileSelect.setEnabled(true); btnDictFileSelect.setEnabled(true); btnPerform.setEnabled(true); btnStop.setEnabled(false); } public final void setUnActive() { //set for control disable txtDbFilePath.setEnabled(false); txtSourceFilePath.setEnabled(false); btnIndexFileSelect.setEnabled(false); btnDictFileSelect.setEnabled(false); btnPerform.setEnabled(false); btnStop.setEnabled(true); } public static void main(String[] args) { //set Look and Feel JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception ex) { System.out.println("Failed loading L&amp;F: "); System.out.println(ex); } //perform run program convert data for TDict new ConvertData(); }; } </code></pre> <p>Any ideas? Thanks a lot.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload