3

sqlite データベースにデータを読み書きするアプリケーションがあります。状況によっては、データを書き込んで、DB にあるとすぐにこのデータを読み取る必要があります。以下の例を参照してください。

    public void read() throws SQLException {
    Connection c = DriverManager.getConnection("jdbc:sqlite:C:\\test.sqlite");
    c.setAutoCommit(false);
    try {
        PreparedStatement p = c.prepareStatement("SELECT * FROM test");
        try {
            ResultSet rs = p.executeQuery();
            try {
                while (rs.next()) {
                    System.out.println(rs.getInt("val"));
                }
            } finally {
                rs.close();
            }
        } finally {
            p.close();
        }
    } finally {
        c.close();
    }
}

public void write() throws SQLException {
    Connection c = DriverManager.getConnection("jdbc:sqlite:C:\\test.sqlite");
    c.setAutoCommit(false);
    try {
        PreparedStatement p = c.prepareStatement("INSERT INTO test (val) VALUES (?)");
        try {
            p.setDouble(1, Math.random());
            p.executeUpdate();
            c.commit();
        } finally {
            p.close();
        }

    } finally {
        c.close();
    }
}

public void demonstrate() {
    write();
    read();
}

メソッドを呼び出すとdemonstrate、データは例外なく書き込まれますが、読み取りメソッドは stdout に何も出力しません。アプリケーションを再起動すると、前回の実行で書き込まれたデータを確認できます。上記の例は単純化されています。実際のアプリケーションでは、クエリごとにさらに多くのデータを書き込む必要があります。

では、SQLite が現在のセッションで書き込まれたデータを認識しないのはなぜでしょうか?

4

1 に答える 1

3

Driver Manager を使用して SQLConnection を取得していることに気付きました。ドライバー マネージャーに SQL ドライバーを登録するのを忘れている可能性があります。コードのどこかに次のようなものが必要です (一度だけ実行する必要があります)。

  DriverManager.registerDriver(new org.sqlite.JDBC());

編集:

コードに小さなバグがあります: double を書いて int を読んでいます。テストするために、double 型の列「val」を持つテーブル「test」を作成しました。

プログラムを実行するたびに、出力に新しい行が書き込まれます。

0
0
0

これは、プログラムを 3 回実行した後の出力です。データベースには 3 つの行があり、プログラムを実行するたびにもう 1 つ追加されます (0 の値は、double 値から int を読み取っているためであり、random は 0 と 1 の間の値を返します)。

私が持っている唯一の説明は、おそらく SQLite ドライバーのバグです。

ドライバーの更新については、こちらの回答を参照してください

于 2012-07-06T12:40:26.503 に答える