2012年8月26日日曜日

Android データベースを作成する

以前、assetsフォルダにCreateTable文を配置しSQLiteOpenHelperクラスを使用して、データベースを作成しました。
Android SQLiteデータベースを作成する
Android SQLiteデータベースを作成する(SQL文をリソースファイルに定義する)


SQLiteOpenHelperクラスを使用したデータベース作成が、イマイチ使いにくいデス。(私には)


仕様
  1. データベースがあれば削除する。
  2. データベースを作成する。
  3. assets/sql/createtableフォルダに配置しているsqlを実行し、データベースにテーブルを作成する。
  4. Upgradeはない。


そこで自作のデータベースヘルパークラスを作ってみました。

MyDatabaseHelper.java
package com.example.helloandroid;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.content.res.AssetManager;
import android.database.sqlite.SQLiteDatabase;

public class MyDatabaseHelper {

    package com.example.helloandroid.service;

    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;

    public class DatabaseHelper {

        /* データベース名 */
        private final static String DB_NAME = "HelloAndroid";   
        /* assetsフォルダのCreateTable文を配置しているディレクトリのパス*/
        private final static String CREATETABLESQL_DIR= "sql/createtable";

        /* コンテキストオブジェクト */
        private Context mContext;

        /**
         * コンストラクタ
         * @param context
         */
        public DatabaseHelper(Context context){
            mContext = context;
        }


        /**
         * createDatabase
         * @param context
         * DBがあれば削除する。
         * DBを作成する
         * DBテーブルを作成する。
         */
        public void createDatabase()throws IOException { 
            if (isExistDatabase(mContext) == true){
                //DBがあれば削除
                mContext.deleteDatabase(DB_NAME);  
            }
            //DB作成
            SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
            //DBテーブル作成
            createTable(mContext,db);
        }

        /**
         * getReadableDatabase
         * 読込み用でデータベースをオープンします
         * @return
         */
        public SQLiteDatabase getReadableDatabase() { 
            SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME, Context.MODE_WORLD_READABLE, null);
            return db;
        }

        /**
         * getWritableDatabase
         * 書き込み用でデータベースをオープンします
         * @return
         */
        public SQLiteDatabase getWritableDatabase() { 
            SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME, Context.MODE_WORLD_WRITEABLE, null);
            return db;
        }

        /**
         * isExistDatabase
         * データベースをが存在するかを取得します。
         * @param context
         * @return true=存在する  false=存在しない
         */
        private static boolean isExistDatabase(Context context){
            boolean result = false;
            if ( context.getDatabasePath(DB_NAME).exists()){
                result = true;
            }
            return result;
        }

        /**
         * createTable
         * データベースにテーブルを作成します。
         * assets/sql/createに定義したsql文を実行します。
         * @param context
         * @param db
         * @throws IOException
         */
        private static void createTable(Context context,SQLiteDatabase db) throws IOException{
            AssetManager as = context.getResources().getAssets();   
            String files[] = as.list(CREATETABLESQL_DIR); 
            for (int i = 0; i < files.length; i++) {   
                String sql = readFile(as.open(CREATETABLESQL_DIR + "/" + files[i]));
                db.execSQL(sql);   
            }
        }

        /** 
         * readFile 
         * ファイルから文字列を読み込みます。  
         * @param is InputStream 
         * @return ファイルの文字列  
         * @throws IOException  
         */  
        private static 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();   
            }   
    }
}

MainActivity.java
import android.view.View;

import com.example.helloandroid.R;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    } 

    /**
     * button1Click
     * button1クリック時の処理
     * データベースを作成します。
     */
    public void button1Click(View view) {     
        MyDatabaseHelper dbHelper = new MyDatabaseHelper(this);
        try {  
            dbHelper .createDatabase();
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }
}

0 件のコメント: