我用mysql db创建了一个功能齐全的java应用程序。我必须将mysql数据库更改为sqlite数据库,以使应用程序更具可移植性(无需安装)。我正在将所有mysql表和值转换为sqlite。
我是创建数据库和表格,现在,我从用户通过FileChooser选择的.csv文件填充我的salesman
表。用户选择将填充salesman
表的.csv文件后,NetBeans将导致此错误:
java.sql.SQLException: [SQLITE_CONSTRAINT] Abort due to constraint violation (UNIQUE constraint failed: salesman.code)
at org.sqlite.core.DB.newSQLException(DB.java:890)
at org.sqlite.core.DB.newSQLException(DB.java:901)
at org.sqlite.core.DB.execute(DB.java:810)
at org.sqlite.core.DB.executeUpdate(DB.java:847)
at org.sqlite.jdbc3.JDBC3PreparedStatement.executeUpdate(JDBC3PreparedStatement.java:86)
在研究类似问题之后,这意味着我在salesman
表中放置的值与使用salesman
表设置的参数/约束不对齐。但是当我创建表时,我没有放任何UNIQUE
约束。我使用Browser for SQLite创建了表,这是用于创建数据库和表的代码:
try {
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:sandapp.db");
String createSalesmanQuery = "CREATE TABLE IF NOT EXISTS salesman (\n" +
" code INTEGER PRIMARY KEY\n" +
" NOT NULL,\n" +
" name TEXT NOT NULL\n" +
")\n" +
"WITHOUT ROWID;";
ps = conn.prepareStatement(createSalesmanQuery);
ps.executeUpdate();
String emptySalesmanQuery = "DELETE FROM salesman;"; //empties if there are contents
ps = conn.prepareStatement(emptySalesmanQuery);
ps.executeUpdate();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
约束WITHOUT ROWID
存在,因为属性code
来自另一个数据库,因此不应该是自动递增的表ID。我已经检查了.csv文件,其中列codes
的所有值都是,并且没有重复值。此文件也用于mysql db并成功上传。有人有主意吗?
编辑:这是我从.csv文件中获取销售员详细信息的方法
public static String getSalesmanFromFile(String filePath){
ArrayList<Salesman> salesmanList= new ArrayList<Salesman>();
String status = null;
try {
BufferedReader br = new BufferedReader(new FileReader(filePath));
String line = null;
String[] strSalesman = null;
try {
Class.forName("org.sqlite.JDBC");
Connection connection = DBConnection.getConnection();
PreparedStatement ps = null;
while ((line=br.readLine()) != null){
strSalesman = line.split(",");
salesmanList.add(new Salesman(Integer.parseInt(strSalesman[0]), strSalesman[1]));
String insertSalesmanQuery = "INSERT INTO salesman VALUES(?, ?);";
ps = connection.prepareStatement(insertSalesmanQuery);
for(int i = 0; i<salesmanList.size(); i++){
ps.setInt(1, salesmanList.get(i).getCode());
ps.setString(2, salesmanList.get(i).getName());
ps.executeUpdate();
}
status = "Successfully uploaded";
}
ps.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (SQLException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} finally {
try {
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
status = "Error"; //- Please review file selected. Make sure that format is followed.";
System.out.println(status);
}
return status;
以下是.csv文件中的销售员详细信息示例:
5099 JONATHAN REYES
5010 EDWIN DAVID
这两个值在NetBeans的输出日志中返回上述错误。