Android SQLiteデータベースを作成する
Android SQLiteデータベースを作成する(SQL文をリソースファイルに定義する)
SQLiteOpenHelperクラスを使用したデータベース作成が、イマイチ使いにくいデス。(私には)
仕様
- データベースがあれば削除する。
- データベースを作成する。
- assets/sql/createtableフォルダに配置しているsqlを実行し、データベースにテーブルを作成する。
- 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 件のコメント:
コメントを投稿