2012-01-19 10 views
1

グラフを表示するアプリケーションがあります。これはSQLテーブルのデータで埋められています。私は、ユーザーがチャートを変更できるようにテーブルを「編集」する可能性を探していました。今日、私はVaadin "SQLContainer"アドオンを見つけました。これは私が必要とするものです。私はデータベースに接続し、必要なテーブルを取得してVaadinテーブルに接続することができたので、Vaadin内のデータベーステーブルを見ることができました。私はSQLContainer(更新AdressBookチュートリアル)のVaadinチュートリアルをかなり読んだことがありますが、SQLContainer経由でDBに何かをコミットする方法はまだありません。Vaadin:新しい項目をデータベースにコミットする(SQLContainer)

public void displayTable(){ 
    try { 
     connectionPool = new SimpleJDBCConnectionPool(
       "org.postgresql.Driver", 
       "jdbc:postgresql://localhost:5432/database", "username", "password", 2, 5); 
     FreeformQuery query = new FreeformQuery("select * FROM table", connectionPool); 
     container = new SQLContainer(query); 
     container.addListener(new QueryDelegate.RowIdChangeListener() { 
      public void rowIdChange(RowIdChangeEvent event) { 
       System.err.println("Old ID: " + event.getOldRowId()); 
       System.err.println("New ID: " + event.getNewRowId()); 
      } 
     }); 
    } catch (SQLException e) { 
      e.printStackTrace(); 
    } 
    table= new Table("Table",container); 
    table.setSelectable(true); 
    table.addListener(this); 
    window.addComponent(table); 
    } 

} 

を私はVaadinバージョン6.6.6で働いていると私はPostgrSQLを使用します。これは私がこれまで持っているものです。

+0

ところで、あなたはバージョン7の現在のバージョンにバンドル新しいVaadin [グリッド](https://vaadin.com/grid)ウィジェットに面白いかもしれそれは内蔵の編集が含まれてペイン。 [The Book of Vaadin](https://vaadin.com/book/vaadin7/-/page/components.grid.html)を参照してください。 –

答えて

3

あなたのクエリは「select * FROM table」です。このような場合は、FreeformQueryの代わりにTableQueryを使用する必要があります。 TableQueryには、すでに単一のSQLテーブルから直接コンテナを作成する場合に実装された、すべての読み取り/書き込み、ソート、フィルタリングなどがあります。

vaadinテーブルを編集可能なモード(setEditable)に設定し、データベースの値を直接操作できるようにして、writeThroughモードとautoCommitモードに入れない限りcontainer.commit() 。または、テーブルの1つの行(1つの項目)を取り、Vaadinフォームで編集することもできます。

FreeformQueryを使用する必要がある場合(2つ以上のテーブルをジョインするなど、より複雑なクエリの場合)は、既に別の回答に記載されているように、自分で書き込みサポートを実装する必要があります。この簡単な例については、SQLContainerデモアプリケーションのthe implementation of the DemoFreeformQueryDelegateを参照してください。

HTH

+0

テーブル内の値を直接編集してDBにコミットすることができます。これは、クエリが「シンプル」なので長く動作します。例えば、 "select * from table"の代わりに "select column1 + column2 from table"を使用すると、その文のためにFreeformQueryが必要になるか、TableQueryを使用できますか? – Kiesa

+0

@Kiesaでも、TableQueryを使用してUI(Table.setVisibleColumns)の余分な列を非表示にし、GeneratedColumnを使用して列を連結できますが、これはもちろんデータベースからすべての列をロードします。連結された列は、もちろん、個別に格納/編集する必要があります。要約すると、1つのSQLテーブルからデータを処理するだけであれば、いつでもソリューションをJavaコードに移動できます。他の状況では、FreeformQueryを使用する必要があります。 HTH – Jonatan

1

それはSqlContainerになると著者は、彼は次のように情報をご提供

FreeformQueryモードを使用すると、しかし、あなたがのために サポートをimpelmentする必要があり、任意の複雑なクエリを指定し、 それの結果は、コンテナを取り込む持つことができますFreeformQueryDelegateインターフェイスを実装することによって、書き込み、並べ替え、フィルタリングおよび遅延読み込みを行うことができます。

私はSqlContainer自分自身を使用しますが、ここでそれについてsamplesource cod電子でいません。テーブルの行を押すと、データを保存/編集するオプションが表示されます。

関連する問題