create table
package test.example.com.test25;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;
public class clsDatabaseCreate extends clsDatabaseOpen {
clsDatabaseCreate(Context context)
{
super(context);
}
public int testTest1()
{
int iResult= 0;
Integer iExists = 0;
iExists = existsTable("tbl3");
iResult = getError();
if(iResult > 0)
{
Log.d("testTest1","存在チェックエラー");
return 1;
}
Log.d("iExists",String.valueOf(iExists));
if(iExists == 1)
{
Log.d("testTest1","既存テーブルがあるため処理を中止します");
return 0;
}
StringBuilder sSQL = new StringBuilder();
sSQL.append(" create table tbl3(");
sSQL.append(" fld1 integer,");
sSQL.append(" fld2 double,");
sSQL.append(" fld3 text,");
sSQL.append(" primary key(fld1)");
sSQL.append(" )");
Log.d("testTest1",sSQL.toString());
SQLiteStatement stmt = null;
super.db.beginTransaction();
try
{
Log.d("execute","start");
stmt = super.db.compileStatement(sSQL.toString());
Log.d("execute","compileStatement");
stmt.execute();
Log.d("execute","end");
//DDLであればCOMMITなしでできるはずですがCOMMITは必須のようです
super.db.setTransactionSuccessful();
Log.d("testTest1","setTransactionSuccessful");
}
catch (SQLException e)
{
Log.d("error",e.getMessage().toString());
Log.d("testTest2","setTransactionSuccessfulをさせずにendTransactionで確定させる");
return 1;
}
catch (Exception e2)
{
Log.d("error",e2.getMessage().toString());
Log.d("testTest2","setTransactionSuccessfulをさせずにendTransactionで確定させる");
return 1;
}
finally
{
super.db.endTransaction();
Log.d("testTest1","確定処理");
sSQL.delete(0,sSQL.length());
stmt = null;
sSQL = null;
}
Log.d("testTest1","end");
return 0;
}
public int testTest2()
{
Log.d("testTest2","start");
int iResult = 0;
Integer iExists = 0;
iExists = existsTable("tbl4");
iResult = getError();
if(iResult > 0)
{
Log.d("testTest2","存在チェックエラー");
return 1;
}
Log.d("iExists",String.valueOf(iExists));
if(iExists == 1)
{
Log.d("testTest2","既存テーブルがあるため処理を中止します");
return 0;
}
StringBuilder sSQL = new StringBuilder();
sSQL.append(" create table tbl4(");
sSQL.append(" fld1 integer,");
sSQL.append(" fld2 double,");
sSQL.append(" fld3 text,");
sSQL.append(" primary key(fld1)");
sSQL.append(" )");
Log.d("sSQL", sSQL.toString());
super.db.execSQL("BEGIN TRANSACTION");
Log.d("testTest2","BEGIN TRANSACTION");
try
{
Log.d("execSQL","start");
super.db.execSQL(sSQL.toString());
Log.d("execSQL","end");
//DDLであればCOMMITなしでできるはずですがCOMMITは必須のようです
super.db.execSQL("COMMIT TRANSACTION");
Log.d("testTest2","COMMIT TRANSACTION");
}
catch (SQLException e3)
{
Log.d("error",e3.getMessage().toString());
super.db.execSQL("ROLLBACK TRANSACTION");
return 1;
}
catch (Exception e4)
{
Log.d("error",e4.getMessage().toString());
super.db.execSQL("ROLLBACK TRANSACTION");
return 1;
}
finally
{
sSQL.delete(0,sSQL.length());
sSQL = null;
}
return 0;
}
/*
//clsDatabaseOpenで実装
//----------------------------------------------------------------------------------------------
//iExists:存在有無
//0:存在しない
//1:存在する
//sTable:テーブルID
//戻り値
//0:正常
//1:異常
private int mError = 0;
protected int getError()
{
return mError;
}
protected int existsTable(String sTable)
{
int iExists = 0;
mError = 0;
Log.d("existsTable","start");
StringBuilder sSQL = new StringBuilder();
sSQL.append(" select count(*) from sqlite_master");
sSQL.append(" where");
sSQL.append(" type = 'table'");
sSQL.append(" and name = '");
sSQL.append(sTable);
sSQL.append("'");
Log.d("sSQL",sSQL.toString());
Cursor cursor = null;
try
{
//SQLの実行
cursor = db.rawQuery(sSQL.toString(), null);
//カーソル位置を先頭にします
cursor.moveToFirst();
Log.d("cursor.moveToFirst","カーソル位置を先頭にします");
iExists = 0;
for (int i = 0; i < cursor.getCount(); i++)
{
iExists = cursor.getInt(0);
//カーソルを進める
cursor.moveToNext();
}
Log.d("iExists",String.valueOf(iExists));
cursor.close();
Log.d("selectNum","カーソルを閉じました");
}
catch (Exception e)
{
Log.d("error", e.getMessage().toString());
mError = 1;
return iExists;
}
finally
{
cursor = null;
}
Log.d("existsTable","end");
return iExists;
}
//----------------------------------------------------------------------------------------------
*/
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
|
テーブルを作成する時に
「SQLiteStatement」ステートメントもしくはexecSQLを使用した方法で実行したサンプルです。
DDLを実行すると通常コミットなしでも確定されると思っていたのですが、
「SQLiteStatement」ステートメントであれば「setTransactionSuccessful」を
execSQLであればexecSQL("COMMIT TRANSACTION")を実行しなければ
確定処理となりませんでした。
テーブル存在チェックを、このクラスを継承しているclsDatabaseOpenで実装しています。
コメントアウトした「protected int existsTable(String sTable)」のメソッドが該当部分となります。
sqliteから「sqlite_master」テーブルに条件を指定して実行するとテーブルの存在を確認できます。
データベースの接続・切断を継承しているクラスは次のページを参考にしてください。
URL [http://abc3.me/computer/android/4/android-7-1.php] (クリックをすると開きます)
クラスの呼び元です。
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);
//databaseDrop();
databaseCreate();
//databaseTransaction();
//databaseUpdate();
//databaseDelete();
//databaseInsert();
//databaseSelect();
//databaseOpenClose();
//readFile();
}
private void databaseCreate()
{
int iResult = 0;
clsDatabaseCreate cls = new clsDatabaseCreate(this);
if (cls.DatabaseOpen() > 0)
{
cls = null;
Log.d("databaseUpdate", "データ接続エラーが発生しました。");
return;
}
//beginTransaction
if(cls.testTest1() > 0)
{
cls = null;
Log.d("databaseUpdate", "DDLエラーが発生しました。");
return;
}
//execSQL
if(cls.testTest2() > 0)
{
cls = null;
Log.d("databaseUpdate", "DDLエラーが発生しました。");
return;
}
if (cls.DatabaseClose() > 0)
{
cls = null;
Log.d("databaseUpdate", "データ切断エラーが発生しました。");
return;
}
}
}
|
|
|