[Android Studio] テーブルの行を削除する(DELETE)

どうも、tatsuです!

今日は、テーブルの行を削除する(DELETE)方法を説明します。

※この記事で使用しているAndroid Studioのバージョンは2.3.3です。

テーブルの行を削除する(DELETE)

今回はDELETE構文を使って、テーブルの行を削除する処理を実装します。

CustomOpenHelper.java

CustomOpenHelper.javaは以下の通りです。

public class CustomOpenHelper extends SQLiteOpenHelper {

    // データベース自体の名前(テーブル名ではない)
    static final private String DBName = "TATSU_DB";
    // データベースのバージョン(2,3と挙げていくとonUpgradeメソッドが実行される)
    static final private int VERSION = 1;

    // コンストラクタ 以下のように呼ぶこと
    public CustomOpenHelper(Context context){
        super(context, DBName, null, VERSION);
    }

    // データベースが作成された時に実行される処理
    @Override
    public void onCreate(SQLiteDatabase db) {
        /**
         * テーブルを作成する
         * execSQLメソッドにCREATET TABLE命令を文字列として渡すことで実行される
         * 引数で指定されているものの意味は以下の通り
         * 引数1 ・・・ id:列名 , INTEGER:数値型 , PRIMATY KEY:テーブル内の行で重複無し , AUTOINCREMENT:1から順番に振っていく
         * 引数2 ・・・ name:列名 , TEXT:文字列型
         * 引数3 ・・・ price:列名 , INTEGER:数値型
          */
        db.execSQL("CREATE TABLE FOOD_TABLE (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "name TEXT, " +
                "price INTEGER)");

        /**
         * FOOD_TABLEに行を追加する
         * VALUESの前と後に()があるが、前の()に列名、後の()に実際入れる値を指定する
         * idは自動で振られるため指定しない
         */
        db.execSQL("INSERT INTO FOOD_TABLE(name, price) VALUES('ラーメン', 700)");
        db.execSQL("INSERT INTO FOOD_TABLE(name, price) VALUES('そうめん', 300)");
        db.execSQL("INSERT INTO FOOD_TABLE(name, price) VALUES('パスタ', 600)");
    }

    // データベースをバージョンアップした時に実行される処理
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        /**
         * テーブルを削除する
         */
        db.execSQL("DROP TABLE IF EXISTS FOOD_TABLE");

        // 新しくテーブルを作成する
        onCreate(db);
    }

    // データベースが開かれた時に実行される処理
    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
    }
}

MainActivity.java

MainActivity.javaは以下の通りです。
onCreateメソッドの中身が長くなってきたのでメソッドを分割しました。

public class MainActivity extends AppCompatActivity {

    // CustomOpenHelperクラスを定義
    CustomOpenHelper helper = null;

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

        // idがsearchButtonのボタンを取得
        Button button = (Button) findViewById(R.id.searchButton);
        // clickイベント追加
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                selectFoodTable();
            }
        });


        // idがdeleteButtonのボタンを取得
        Button deleteButton = (Button) findViewById(R.id.deleteButton);
        // clickイベント追加
        deleteButton.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                deleteFoodTable();
            }
        });
    }


    // FOOD_TABLEの全行を取得してTextViewに表示
    private void selectFoodTable(){
        // CustomOpenHelperクラスがまだインスタンス化されていなかったらインスタンス化する
        if(helper == null){
            helper = new CustomOpenHelper(MainActivity.this);
        }
        // データベースを取得する
        SQLiteDatabase db = helper.getWritableDatabase();
        try {
            // rawQueryというSELECT専用メソッドを使用してデータを取得する
            Cursor c = db.rawQuery("select id, name, price from FOOD_TABLE", null);
            // Cursorの先頭行があるかどうか確認
            boolean next = c.moveToFirst();

            // 最終的に表示する文字列
            String dispStr = "";
            // 取得した全ての行を取得
            while (next) {
                // 取得したカラムの順番(0から始まる)と型を指定してデータを取得する
                String rowdata = String.valueOf(c.getInt(0))+" , ";// idを取得
                rowdata += c.getString(1)+" , ";// nameを取得
                rowdata += String.valueOf(c.getInt(2));// priceを取得
                dispStr += rowdata + "\n";// \nは改行を表し、複数行取れた場合に一行ごとに改行するため
                // 次の行が存在するか確認
                next = c.moveToNext();
            }
            dispStr += "取得完了";

            // TextViewに取得したデータを表示
            ((TextView) findViewById(R.id.searchText)).setText(dispStr);
        } finally {
            // finallyは、tryの中で例外が発生した時でも必ず実行される
            // dbを開いたら確実にclose
            db.close();
        }
    }


    // FOOD_TABLEの行を削除
    private void deleteFoodTable(){
        // CustomOpenHelperクラスがまだインスタンス化されていなかったらインスタンス化する
        if(helper == null){
            helper = new CustomOpenHelper(MainActivity.this);
        }
        // データベースを取得する
        SQLiteDatabase db = helper.getWritableDatabase();
        try {
            // 値段が一番低いデータを削除
            db.execSQL("delete from FOOD_TABLE where price = (select MIN(price) from FOOD_TABLE)");

        } finally {
            // finallyは、tryの中で例外が発生した時でも必ず実行される
            // dbを開いたら確実にclose
            db.close();
        }
    }
}

activity_main.xml

activity_main.xmlは以下の通りです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.android.tatsu.myapplication.MainActivity">

    <TextView
        android:id="@+id/searchText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>

    <Button
        android:id="@+id/searchButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="データを取得">
    </Button>

    <Button
        android:id="@+id/deleteButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="値段が一番低いデータを削除">
    </Button>

</LinearLayout>

結果

↓「データを取得」押下後

↓「データを削除」→「データを取得」押下後(1回目)

↓「データを削除」→「データを取得」押下後(2回目)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です