データベース接続・切断処理
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
//ログを出力するため
import android.util.Log;
public class clsDatabaseOpen extends SQLiteOpenHelper {
private static String CON_DATABASE_NAME = "test";
private static String CON_DATABASE_NAME_ASSET = "test.db";
private static final int CON_DATABASE_VERSION = 1;
protected SQLiteDatabase db = null;
protected Context mContext = null;
private File mDatabasePath = null;
//コンストラクタ
clsDatabaseOpen(Context context)
{
super(context, CON_DATABASE_NAME, null, CON_DATABASE_VERSION);
//初期設定
mContext = context;
mDatabasePath = context.getDatabasePath(CON_DATABASE_NAME);
}
//データベースオープン
public int DatabaseOpen()
{
int iResult = 0;
String sPath = "";
File file = null;
//データベースファイルが存在しない場合は
//データベースファイルを設置します。
iResult = existsDatabaseFile();
if(iResult > 0) return iResult;
try
{
//データベースをオープンします
file = mContext.getFileStreamPath(CON_DATABASE_NAME);
db = SQLiteDatabase.openDatabase(getDatabasePath(),null,SQLiteDatabase.OPEN_READWRITE);
}
catch (SQLException e)
{
Log.d("error",e.getMessage().toString());
releaseObject();
return 2;
}
finally
{
file = null;
}
return 0;
}
//変数を解放します
private void releaseObject()
{
db = null;
mDatabasePath = null;
mContext = null;
}
//データベースファイルのパスを取得します。
private String getDatabasePath()
{
return mDatabasePath.getAbsolutePath();
}
//データベースファイル存在チェック
private int existsFile() {
SQLiteDatabase database = null;
try
{
database = SQLiteDatabase.openDatabase(getDatabasePath(),null,SQLiteDatabase.OPEN_READONLY);
if(database == null) return 1;
database.close();
}
catch (SQLException e)
{
Log.d("error",e.getMessage().toString());
return 1;
}
finally
{
database = null;
}
return 0;
}
//データベース存在チェック
//戻り値
//0:正常
//1:データベースコピーエラー
//2:異常
private int existsDatabaseFile()
{
int iResult = 0;
if (existsFile() < 1)
{
//データベースファイルが存在するケース
getReadableDatabase();
try {
//OPEN_READWRITEはあとでsetVersionをするため
db = SQLiteDatabase.openDatabase(getDatabasePath(), null, SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {
Log.d("error",e.getMessage().toString());
return 2;
}
}
else
{
//データベースが存在しないケース
Log.d("existsDatabaseFile","データベースが存在しないケース");
iResult = copyDatabaseFileResourceToLocal();
if(iResult > 0) return iResult;
}
db.setVersion(CON_DATABASE_VERSION);
//あとでデータベースをオープンして使用するので
//ここでオープンしたデータベースファイルは閉じます。
db.close();
return 0;
}
//リソースからデータベースファイルをコピー
//データベースファイルが存在しない
//戻り値
//0:正常
//1:データベースコピーエラー
private int copyDatabaseFileResourceToLocal()
{
String sPath = "";
try {
// このメソッドを呼ぶことで、空のデータベースがアプリのデフォルトシステムパスに作られる
getReadableDatabase();
// asset に格納したデータベースをコピーする
copyDataBaseFromAsset();
try {
db = SQLiteDatabase.openDatabase( getDatabasePath(), null, SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {
Log.d("error",e.getMessage().toString());
return 1;
}
} catch (IOException e) {
Log.d("error",e.getMessage().toString());
return 1;
}
return 0;
}
//asset に格納したデーだベースをデフォルトのデータベースパスに作成したからのデータベースにコピーする
private void copyDataBaseFromAsset() throws IOException{
// asset 内のデータベースファイルにアクセス
InputStream input = mContext.getAssets().open(CON_DATABASE_NAME_ASSET);
// デフォルトのデータベースパスに作成した空のDB
OutputStream output = new FileOutputStream(mDatabasePath);
//リソースからデータベースファイルをコピー
byte[] buffer = new byte[1024];
int size;
while ((size = input.read(buffer)) > 0) {
output.write(buffer, 0, size);
}
//ストリームを閉じます
output.flush();
output.close();
input.close();
}
//データベースクローズ
public int DatabaseClose()
{
try
{
if(db != null)
db.close();
super.close();
}
catch (Exception e)
{
Log.d("error",e.getMessage().toString());
return 1;
}
finally
{
releaseObject();
}
return 0;
}
//SQLiteOpenHelperを継承すると次の2つを実装する必要があります
//onCreate
//onUpgrade
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
|
データベースファイルの存在チェックをします。
ファイルが存在しない場合はリソースに保存したデータベースファイルを指定の場所に
コピーします。
データベースのチェックをするために「openDatabase」メソッドを実行します。
正常に実行できるとファイルをオープンしたことになるので、
存在チェックの段階ではcloseメソッドで閉じる必要があります。
存在チェックが終わったらデータベースファイルは存在していますが、
データベースファイルは閉じられているので
「openDatabase」メソッドでオープンします。
これでデータベースをオープンできます。
データベースは「SQLiteDatabase」オブジェクトで保持しておき
DML、必要に応じてDDL処理をしてください。
終わったらデータベースを閉じるためクローズ処理をしています。
このとき、使用したprivateなどの変数は解放処理をしています。
呼び元は次のように実装しています。
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseOpenClose();
//readFile();
}
private void databaseOpenClose()
{
int iResult = 0;
clsDatabaseOpen cls = new clsDatabaseOpen(this);
iResult = cls.DatabaseOpen();
if (iResult > 0)
{
Log.d("databaseOpenClose", "データベース接続エラーが発生しました。");
}
iResult = cls.DatabaseClose();
Log.d("DatabaseClose iResult",String.valueOf(iResult));
}
}
|
|
|