1~2つのテーブルならアリかもしれませんが、テーブル数が多いのでsql文をリソースファイルに定義したいと思います。
assets\sql\createフォルダにCREATE TABLE文を定義したsqlを配置します。
assets\sql\dropフォルダにDROP TABLE文を定義したsqlを配置します。
assets\sql\create\categories.sql
初期データを追加するInsert文も定義しています。sql文の区切りは「/」にしました。
CREATE TABLE Categories ( CategoryID integer PRIMARY KEY, CategoryName text NOT NULL, Description text ) / INSERT INTO Categories (CategoryID,CategoryName,Description) values (1,"飲料","") / INSERT INTO Categories (CategoryID,CategoryName,Description) values (2,"香辛料","") / INSERT INTO Categories (CategoryID,CategoryName,Description) values (3,"加工食品","")assets\sql\create\products.sql
CREATE TABLE Products ( ProductsID integer PRIMARY KEY, ProductsName text NOT NULL, CategoryID integer NOT NULL )assets\sql\drop\categories.sql
DROP TABLE Categoriesassets\sql\drop\products.sql
DROP TABLE Products
MainActivity.java
package my.study.android; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //データベースヘルパーのインスタンスを作成する(まだデータベースはできない) DatabaseHelper dbHelper = new DatabaseHelper(this); //データベースオブジェクトを取得する(データベースにアクセスすると作成される。) SQLiteDatabase db = dbHelper.getWritableDatabase(); //データベースを閉じる db.close(); } }
DatabaseHelper.java
package my.study.android; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import android.content.Context; import android.content.res.AssetManager; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper { /* データベース名 */ private final static String DB_NAME = "androidstudydb"; /* データベースのバージョン */ private final static int DB_VER = 2; /* コンテキスト */ private Context mContext; /** * コンストラクタ */ public DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VER); mContext = context; } /** * データベースが作成された時に呼ばれます。 * assets/sql/create内に定義されているsqlを実行します。 */ @Override public void onCreate(SQLiteDatabase db) { try { execSql(db,"sql/create"); } catch (IOException e) { e.printStackTrace(); } } /** * データベースをバージョンアップした時に呼ばれます。 * assets/sql/drop内に定義されているsqlを実行します。 * その後onCreate()メソッドを呼び出します。 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { try { execSql(db,"sql/drop"); } catch (IOException e) { e.printStackTrace(); } onCreate(db); } /** * 引数に指定したassetsフォルダ内のsqlを実行します。 * @param db データベース * @param assetsDir assetsフォルダ内のフォルダのパス * @throws IOException */ private void execSql(SQLiteDatabase db,String assetsDir) throws IOException { AssetManager as = mContext.getResources().getAssets(); try { String files[] = as.list(assetsDir); for (int i = 0; i < files.length; i++) { String str = readFile(as.open(assetsDir + "/" + files[i])); for (String sql: str.split("/")){ db.execSQL(sql); } } } catch (IOException e) { e.printStackTrace(); } } /** * ファイルから文字列を読み込みます。 * @param is * @return ファイルの文字列 * @throws IOException */ private String readFile(InputStream is) throws IOException{ BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(is,"SJIS")); StringBuilder sb = new StringBuilder(); String str; while((str = br.readLine()) != null){ sb.append(str +"\n"); } return sb.toString(); } finally { if (br != null) br.close(); } } }
【関連項目】
Android SQLiteデータベースを作成する
Android SQLiteのGUIツール
Android データベースにデータを書き込む(Insert、Update、Delete)
Android データベースのデータを読み込む(Select)
Android SQLiteデータベースを作成する(SQL文をリソースファイルに定義する)
Android ファイル読み込み(res/rawフォルダ、assetsフォルダ)
2 件のコメント:
大変参考になりました。
ありがとうございます。
求めていたものがすべて過不足なくありました。
参考にさせていただきます。
コメントを投稿