質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

4585閲覧

JAVAからSQLiteのテーブル作成

moredeep

総合スコア1507

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/11/01 03:01

編集2015/11/01 03:02

###前提・実現したいこと
JAVAのアプリケーションからSQLiteのテーブル3つの存在確認を行い、
存在しなければテーブルを作成しようとしています。

###発生している問題・エラーメッセージ
テーブルの存在確認は正しくできているようですが、
その後テーブルを作成する際に、3つのうち一つしか作成されません。
何か制約があるのでしょうか?
何かやり方がおかしいのでしょうか?

下記コード内のSQL文をコマンドラインから直接発行すると、テーブル作成は可能です。

なお、本来複数ファイルに分けているものを、
実行に必要な分だけ持ってきているので、使っていない変数などは気にしないでください。
(このコードで再現することは確認済みです。)

###ソースコード

Java

1import java.sql.Connection; 2import java.sql.DriverManager; 3import java.sql.ResultSet; 4import java.sql.SQLException; 5import java.sql.Statement; 6 7public class Test { 8 public static String SELECT_TABLE = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='__TABLENAME__'"; 9 public static String CREATE_INFO = "CREATE TABLE INFO(ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME,IMAGE,ATTRIBUTE,OBTAINING_METHOD,TAG);"; 10 public static String CREATE_TAG = "CREATE TABLE TAG(ID INTEGER PRIMARY KEY AUTOINCREMENT,TAG_NAME,TAG_DETAIL);"; 11 public static String CREATE_NAME = "CREATE TABLE NAME(ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME_NAME,NAME_DETAIL);"; 12 private static Connection con = null; 13 private int batchCount = 0; 14 private static final String dbFilePath = "C:/Test.db"; 15 16 public static void main(String[] args) { 17 try { 18 Class.forName("org.sqlite.JDBC"); 19 con = DriverManager.getConnection("jdbc:sqlite:" + dbFilePath); 20 Statement stmt = con.createStatement(); 21 isTable(stmt); 22 } catch (SQLException | ClassNotFoundException e) { 23 // TODO 自動生成された catch ブロック 24 e.printStackTrace(); 25 System.out.println("テーブル存在確認の失敗"); 26 } 27 } 28 29 //テーブル確認(なければ作る) 30 public static void isTable(Statement stmt) throws SQLException{ 31 String[] tableName = {"INFO", "NAME", "TAG"}; 32 int queryCount = 0; 33 for(int i = 0; i < tableName.length; i++){ 34 String sql = SELECT_TABLE.replace("__TABLENAME__", tableName[i]); 35 ResultSet res = stmt.executeQuery(sql); 36 int result = 0; 37 result = res.getInt(1); 38 39 if(result == 0){ 40 stmt.addBatch(getCreateQuery(tableName[i])); 41 queryCount++; 42 } 43 } 44 if(queryCount != 0){ 45 executeBatch(stmt, queryCount); 46 } 47 } 48 49 public static boolean executeBatch(Statement stmt, int queryCount){ 50 boolean ret = false; 51 try { 52 int[] updateCounts = stmt.executeBatch(); 53 int successCnt = 0; 54 for(int i = 0; i < updateCounts.length; i++){ 55 if(updateCounts[i] >= 0){ 56 //クエリ実行回数 57 successCnt++; 58 } 59 } 60 if(successCnt == queryCount){ 61 ret = true; 62 } 63 } catch (SQLException e) { 64 // TODO 自動生成された catch ブロック 65 e.printStackTrace(); 66 } 67 return ret; 68 } 69 70 public static String getCreateQuery(String tableName){ 71 if(tableName == null){ 72 return ""; 73 } 74 String upperTableName = tableName.toUpperCase(); 75 if(upperTableName.equals("INFO")){ 76 return CREATE_INFO; 77 }else if(upperTableName.equals("TAG")){ 78 return CREATE_TAG; 79 }else if(upperTableName.equals("NAME")){ 80 return CREATE_NAME; 81 } 82 return ""; 83 } 84} 85

###補足情報(言語/FW/ツール等のバージョンなど)
環境は、
java 1.8.0_60
eclipse 4.5
sqlite 3.8.6
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Statementはexecute系メソッドを実行するとaddBatchで追加したSQLは破棄されます。
そのため、isTableメソッドのstmt.addBatch(getCreateQuery(tableName[i]));の代わりにListに追加しておき、executeBatch(stmt, queryCount);の直前でaddBatchすれば3つのテーブルが作成されます。

詳しくはStmt.javaのexecute系メソッドとinternalCloseメソッドを確認してください。

投稿2015/11/01 05:11

shiena

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moredeep

2015/11/01 06:07

回答ありがとうございます!解決できました。
moredeep

2015/11/01 06:41

そんな便利なクエリがあるんですね。。。 使ってみます!
guest

0

こんにちわ。

isTableメソッド内で、executeBatchメソッドが呼び出される場所がforループの外だからでは
ないでしょうか?該当箇所をforループ内に入れてみてください。

投稿2015/11/01 05:06

srsnsts

総合スコア480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moredeep

2015/11/01 06:07

回答ありがとうございます!解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問