liguofeng29’s blog

個人勉強用ブログだっす。

AndroidのIO - SQLiteOpenHelperクラス

実際にSQLiteDatabaseのメソッドを使ってSQLiteDatabaseオブジェクト取得は煩雑のためお勧めしない。

通常はAndroidが提供するSQLiteOpenHelperクラスを使う。

SQLiteOpenHelperのメソッド

  • synchronized SQLiteDatabse getReadableDatabase()
  • synchronized SQLiteDatabse getWritableDatabase()
  • abstract void onCreate(SQLiteDatabase db)
  • abstract void onUpgrade(SQLiteDatabase db)
  • synchronized void close()

開発者は下記メソッドを定義すればいい。

  1. abstract void onCreate(SQLiteDatabase db) :
    getReadableDatabase(),getWritableDatabase()実行する際にDBがなければAndroidはDBを自動生成する。 その後、onCreate()が呼ばれる。 主にテーブル生成、マスタデータなどを実装する。

  2. abstract void onUpgrade(SQLiteDatabase db) : アプリバージョンアップ時使用する

サンプルコード

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="1">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:ems="10"
        android:id="@+id/insertText" />

    <Button
        android:id="@+id/insert"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="insert"
        android:textAllCaps="false"
        android:textSize="20dp"
        />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:ems="10"
        android:id="@+id/selectText"
        android:layout_gravity="center_horizontal" />

    <Button
        android:id="@+id/select"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="select"
        android:textAllCaps="false"
        android:textSize="20dp"
        />
</LinearLayout>
package com.example.liguofeng.sqliteopenhelpersample;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

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

        dbHelper = new MySQLiteOpenHelper(this, "Dictionary.db3", null, 1);

        // insertボタン
        ((Button) findViewById(R.id.insert)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String insertWord = ((EditText) findViewById(R.id.insertText)).getText().toString();

                if (!"".equals(insertWord)) {
                    // 単語登録
                    insertWord(dbHelper.getWritableDatabase(),insertWord);
                    Toast.makeText(
                            MainActivity.this,
                            insertWord + "を登録しました。",
                            Toast.LENGTH_SHORT)
                            .show();
                }
            }
        });

        // selectボタン
        ((Button) findViewById(R.id.select)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String selectWord = ((EditText) findViewById(R.id.selectText)).getText().toString();
                if (!"".equals(selectWord)) {
                    // 単語登録
                    Cursor cursor =  dbHelper.getReadableDatabase().rawQuery(
                                            "select count(*) as count from dict where word = ? "
                                            , new String[]{selectWord}
                    );

                    int count = 0;
                    while(cursor.moveToNext()) {
                        count = cursor.getInt(cursor.getColumnIndex("count"));
                        break;
                    }

                    if (count > 0) {
                        Toast.makeText(
                                MainActivity.this,
                                "データあり",
                                Toast.LENGTH_SHORT)
                                .show();
                    } else {
                        Toast.makeText(
                                MainActivity.this,
                                "データなし",
                                Toast.LENGTH_SHORT)
                                .show();
                    }
                }
            }
        });
    }

    // insert
    private void insertWord(SQLiteDatabase db, String word) {
        db.execSQL("insert into dict values(null, ?)", new String[]{word});
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (dbHelper != null) {
            dbHelper.close();;
        }
    }
}

f:id:liguofeng29:20151226005211g:plain