###前提・実現したいこと
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
です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/01 06:07
2015/11/01 06:46 編集
2015/11/01 06:41