2010年9月30日木曜日

Android SQLiteデータベースを作成する(SQL文をリソースファイルに定義する)

Android SQLiteデータベースを作成する では、onCreate()メソッドで実行するSQL文をハードコーディングしていました。
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 Categories
assets\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 件のコメント:

匿名 さんのコメント...

大変参考になりました。
ありがとうございます。

sheepman さんのコメント...

求めていたものがすべて過不足なくありました。
参考にさせていただきます。