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フォルダ)