2017-09-18 15 views
2

メモリ内のsqliteデータベースにテーブルを作成しようとしています。私はgetConnectionメソッドでデータベースへの接続を初期化するテーブルを作成するためにcreateTableというメソッドを持っています。私は012を行うとメモリ内のsqliteデータベースにエラーメッセージなしでテーブルを作成できません

public void insert() { 
    try { 
     final Connection connection = getConnection(); 
     final Statement statement = connection.createStatement(); 
     statement.executeUpdate(
      "INSERT INTO videos (title, path, category) VALUES ('test title', 'test path', 'test category');"); 
     statement.close(); 
     connection.close(); 
    } catch (final SQLException e) { 
     LOGGER.warn("Failed to insert.", e); 
    } 
} 

private void createTable() { 
    try { 
     final Connection connection = getConnection(); 
     final Statement statement = connection.createStatement(); 
     statement.execute(
      "CREATE TABLE videos (id INTEGER PRIMARY KEY, title VARCHAR(255), description TEXT, path TEXT, category VARCHAR(255), published INTEGER DEFAULT 0, created TIMESTAMP DEFAULT CURRENT_TIMESTAMP);"); 
     statement.close(); 
     connection.close(); 
    } catch (final SQLException e) { 
     LOGGER.warn("Failed to create table.", e); 
    } 
} 

のgetConnection

private static Connection getConnection() { 
    try { 
     Class.forName("org.sqlite.JDBC"); 
     return DriverManager.getConnection("jdbc:sqlite:"); 
    } catch (final Exception e) { 
     LOGGER.warn("Failed to get connection.", e); 
     throw new RuntimeException(e); 
    } 
} 

私はシンプルinsert方法を書いたデータベースをテストするには、次のcreateTableが

this.createTable(); this.insert(); 
は、私は次のエラーを得た:sqliteの-JDBCさんがV 3.20.0:私は org.xerialを使用しています接続の場合

2017-09-17 22:38:02 WARN Database:128 - Failed to insert. 
org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (no such table: videos) 
    at org.sqlite.core.DB.newSQLException(DB.java:909) 
    at org.sqlite.core.DB.newSQLException(DB.java:921) 
    at org.sqlite.core.DB.throwex(DB.java:886) 
    at org.sqlite.core.NativeDB._exec_utf8(Native Method) 
    at org.sqlite.core.NativeDB._exec(NativeDB.java:87) 
    at org.sqlite.jdbc3.JDBC3Statement.executeUpdate(JDBC3Statement.java:116)... 

テーブルが作成されない理由はありますか?私は例外や何かを見ていない。 SQLFiddle for the example aboveは問題ありません。私が正しくthe documentationを読めば

+0

同じデータベース接続を使用する場合は機能しますか? – Thilo

答えて

1

、データベースは、デフォルトでそのデータベース接続内に存在する:

Instead, a new database is created purely in memory. The database ceases to exist as soon as the database connection is closed. Every :memory: database is distinct from every other. So, opening two database connections each with the filename ":memory:" will create two independent in-memory databases.

最も簡単な修正プログラムは、2番目の接続をオープンしていますが、作成に使用した接続を使用して保持しないことであろう他のデータベースクエリのテーブルも同様です。

複数の接続を開く場合は、データベースURLに?cache=sharedパラメータを設定できます。

+1

迅速な対応をありがとう。接続文字列を 'jdbc:sqlite:'から 'jdbc:sqlite:?cache = shared'に変更すると問題が解決しました。 – mert

関連する問題