2016-01-17 19 views
1

我有對象DictionarySqlLiteDao,它應該在其初始化期間創建它的表不存在。但儘管數據庫是在文件系統中創建的,但我仍然有例外。幫我弄清楚它的原因。這裏是我的代碼:SQLException:使用SQLite和Scala處理未知數據庫

object DictionarySqlLiteDao extends Dao[Word] { 

private val CREATE_WORD_TABLE_SQL = "CREATE TABLE IF NOT EXISTS thelper.WORD " + 
     "(ID INTEGER PRIMARY KEY AUTOINCREMENT, " + 
     "WORD TEXT NOT NULL, " + 
     "UKR TEXT NOT NULL, " + 
     "ENG TEXT NOT NULL, " + 
     "EXAMPLE TEXT)" 
private val SAVE_WORD_SQL = "INSERT INTO WORD(WORD, UKR, ENG, EXAMPLE" + 
     "VALUES(?, ?, ?, ?)" 
private val connection: Connection = { 
    Class.forName("org.sqlite.JDBC") 
    DriverManager.getConnection("jdbc:sqlite:thelper") 
} 

{ 
    connection.createStatement().executeUpdate(CREATE_WORD_TABLE_SQL) 
} 

override def save(word: Word): Word = { 
    val statement = connection.prepareStatement(SAVE_WORD_SQL, Statement.RETURN_GENERATED_KEYS) 
    statement.setString(1, word.word) 
    statement.setString(2, word.translation("ukr")) 
    statement.setString(3, word.translation("eng")) 
    statement.setString(4, word.example.orNull) 
    statement.executeUpdate() 
    val id = statement.getGeneratedKeys.getInt(1) 
    word.copy(id = id) 
} 

def main(args: Array[String]) { 
    println(connection == null) // here I get false 
    println(connection.createStatement().execute("select date('now')")) // here I get true 
    val w = save(Word(-1, "germanWord", Map("ukr" -> "ukrTranslation", "eng" -> "engTranslation"), Option.empty[String])) // and here I get an Exception 
    println(w) 
} 

}

,這裏是一個例外,我得到:

Exception in thread "main" java.lang.ExceptionInInitializerError 
at thelper.Dictionary.dao.DictionarySqlLiteDao.main(DictionarySqlLiteDao.scala) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: java.sql.SQLException: unknown database thelper 
at org.sqlite.core.NativeDB.throwex(NativeDB.java:397) 
at org.sqlite.core.NativeDB._exec(Native Method) 
at org.sqlite.jdbc3.JDBC3Statement.executeUpdate(JDBC3Statement.java:116) 
at thelper.Dictionary.dao.DictionarySqlLiteDao$.<init>(DictionarySqlLiteDao.scala:23) 
at thelper.Dictionary.dao.DictionarySqlLiteDao$.<clinit>(DictionarySqlLiteDao.scala) 
... 6 more 
+0

也許不相關的例外,但你節省使用SQL'「INSERT INTO字(WORD ,UKR,ENG,EXAMPLEVALUES(?,?,?,?)「'沒有一個範圍和值之間的括號 –

+0

是的,非常感謝,但不幸的是,它與我的主要問題無關 – alex

回答

1

至於我記得你應該指定數據庫的完整路徑,在你的內存它應該是thelper.db像:

DriverManager.getConnection("jdbc:sqlite:thelper.db")` 

PS之後,你可以省略數據庫名:"CREATE TABLE IF NOT EXISTS WORD " + ....

PPS可以用三引號來編寫多串像

"""CREATE TABLE IF NOT EXISTS WORD(
| ID INTEGER PRIMARY KEY AUTOINCREMENT, 
| WORD TEXT NOT NULL, 
| UKR TEXT NOT NULL, 
| ENG TEXT NOT NULL, 
| EXAMPLE TEXT)""".stripMargin 
+0

謝謝。作品! – alex