如何在 Java 中使用带问号的 strftime 函数
How can I use strftime function with question mark in Java
我打算将 'Date' 个对象添加到 SQLite 数据库中。但是,我收到有关插入为空的错误。
错误是这样的
org.sqlite.SQLiteException: [SQLITE_CONSTRAINT_NOTNULL] A NOT NULL constraint failed (NOT NULL constraint failed: dates.Tarih)
at org.sqlite.core.DB.newSQLException(DB.java:909)
at org.sqlite.core.DB.newSQLException(DB.java:921)
at org.sqlite.core.DB.execute(DB.java:825)
at org.sqlite.jdbc3.JDBC3PreparedStatement.execute(JDBC3PreparedStatement.java:53)
这是我的代码。我从问号怀疑。因为当我删除它们并用 'now'
放置它们时。它确实有效。但是,以下代码会抛出上述错误。
插入方法
public static void insert(Date date, Date date2) {
try{
System.out.println(" date:"+date.toString());
String query = "insert into dates(Tarih,Tarih2) values(strftime('%d-%m-%Y',?), strftime('%d-%m-%Y',?))";
pst=conn.prepareStatement(query);
pst.setObject(1,date);
pst.setObject(2,date2);
pst.execute();
}catch (SQLException e){
e.printStackTrace();
}
}
可能您已将列 Tarih
定义为 NOT NULL
,并且您的代码试图在 table.
[ 中插入一个 null
值=19=]
您从 strftime()
得到 null
的原因是因为您没有为 SQLite 传递有效日期。
对于 SQLite,有效的 dates/datetimes 可以是 yyyy-MM-dd hh:mm:ss
格式的字符串,也可以是整数 unix 纪元时间或表示儒略日的浮点数。
你传递的是 Date 对象,这是你的错误。
解决该问题的一种方法是从每个 Date
对象中提取一个表示 unix 纪元时间的整数并将其传递给 strftime()
:
public static void insert(Date date, Date date2) {
try{
long d = date.toInstant().toEpochMilli() / 1000;
long d2 = date2.toInstant().toEpochMilli() / 1000;
String query = "insert into dates(Tarih,Tarih2) values(strftime('%d-%m-%Y', ?, 'unixepoch'), strftime('%d-%m-%Y', ?, 'unixepoch'))";
pst=conn.prepareStatement(query);
pst.setLong(1, d);
pst.setLong(2, d2);
pst.execute();
} catch (SQLException e){
e.printStackTrace();
}
}
我打算将 'Date' 个对象添加到 SQLite 数据库中。但是,我收到有关插入为空的错误。 错误是这样的
org.sqlite.SQLiteException: [SQLITE_CONSTRAINT_NOTNULL] A NOT NULL constraint failed (NOT NULL constraint failed: dates.Tarih)
at org.sqlite.core.DB.newSQLException(DB.java:909)
at org.sqlite.core.DB.newSQLException(DB.java:921)
at org.sqlite.core.DB.execute(DB.java:825)
at org.sqlite.jdbc3.JDBC3PreparedStatement.execute(JDBC3PreparedStatement.java:53)
这是我的代码。我从问号怀疑。因为当我删除它们并用 'now'
放置它们时。它确实有效。但是,以下代码会抛出上述错误。
插入方法
public static void insert(Date date, Date date2) {
try{
System.out.println(" date:"+date.toString());
String query = "insert into dates(Tarih,Tarih2) values(strftime('%d-%m-%Y',?), strftime('%d-%m-%Y',?))";
pst=conn.prepareStatement(query);
pst.setObject(1,date);
pst.setObject(2,date2);
pst.execute();
}catch (SQLException e){
e.printStackTrace();
}
}
可能您已将列 Tarih
定义为 NOT NULL
,并且您的代码试图在 table.
[ 中插入一个 null
值=19=]
您从 strftime()
得到 null
的原因是因为您没有为 SQLite 传递有效日期。
对于 SQLite,有效的 dates/datetimes 可以是 yyyy-MM-dd hh:mm:ss
格式的字符串,也可以是整数 unix 纪元时间或表示儒略日的浮点数。
你传递的是 Date 对象,这是你的错误。
解决该问题的一种方法是从每个 Date
对象中提取一个表示 unix 纪元时间的整数并将其传递给 strftime()
:
public static void insert(Date date, Date date2) {
try{
long d = date.toInstant().toEpochMilli() / 1000;
long d2 = date2.toInstant().toEpochMilli() / 1000;
String query = "insert into dates(Tarih,Tarih2) values(strftime('%d-%m-%Y', ?, 'unixepoch'), strftime('%d-%m-%Y', ?, 'unixepoch'))";
pst=conn.prepareStatement(query);
pst.setLong(1, d);
pst.setLong(2, d2);
pst.execute();
} catch (SQLException e){
e.printStackTrace();
}
}