Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android】SQLiteでUNIQUE制約を使って重複データを防ぐ方法

AndroidにおけるSQLiteデータベースとは

実装例に入る前に、AndroidにおけるSQLiteデータベースについて簡単に確認しておきましょう。SQLiteはオープンソースのSQLデータベースで、デバイス上のテキストファイルにデータを保存します。Androidには標準でSQLiteの実装が組み込まれており、リレーショナルデータベースの機能を幅広くサポートしています。また、JDBCやODBCのような接続設定が一切不要で、すぐにデータベースへアクセスできる点も大きな特徴です。

本記事では、AndroidのSQLiteでUNIQUE制約を使用する方法を、サンプルコードを交えて解説します。UNIQUE制約を付与したカラムには同じ値を重複して登録できなくなるため、データの一意性を保証したい場合に非常に有効です。

実装手順

ステップ1:新しいプロジェクトを作成する

Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成してください。

ステップ2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを記述します。

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
    xmlns:tools = "https://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = ".MainActivity"
    android:orientation = "vertical">
    <EditText
       android:id = "@+id/name"
       android:layout_width = "match_parent"
       android:hint = "Enter Name"
       android:layout_height = "wrap_content" />
    <EditText
       android:id = "@+id/salary"
       android:layout_width = "match_parent"
       android:inputType = "numberDecimal"
       android:hint = "Enter Salary"
       android:layout_height = "wrap_content" />
    <Button
       android:id = "@+id/save"
       android:text = "Save"
       android:layout_width = "wrap_content"
       android:layout_height = "wrap_content" />
</LinearLayout>

このレイアウトでは、名前(name)と給与(salary)を入力するためのEditTextを2つ配置しています。ユーザーが「Save」ボタンをタップすると、入力されたデータがSQLiteデータベースへ保存される仕組みです。

ステップ3:MainActivity.java を編集する

src/MainActivity.java に以下のコードを記述します。

package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
    Button save;
    EditText name, salary;
    @Override
    protected void onCreate(Bundle readdInstanceState) {
        super.onCreate(readdInstanceState);
        setContentView(R.layout.activity_main);
        final DatabaseHelper helper = new DatabaseHelper(this);
        name = findViewById(R.id.name);
        salary = findViewById(R.id.salary);
        findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
                    if (helper.insert(name.getText().toString(), salary.getText().toString())) {
                        Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(MainActivity.this, "NOT Inserted", Toast.LENGTH_LONG).show();
                    }
                } else {
                    name.setError("Enter NAME");
                    salary.setError("Enter Salary");
                }
            }
        });
    }
}

このアクティビティでは、まずEditTextの入力内容が空でないかをチェックします。両方に入力がある場合は、DatabaseHelperクラスのinsert()メソッドを呼び出してデータを登録し、その成否をToastで表示します。未入力の項目があれば、setError()によってエラーメッセージを促す設計になっています。

ステップ4:DatabaseHelper.java を作成する

src/DatabaseHelper.java に以下のコードを記述します。

package com.example.andy.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "MyDBName";
    public static final String CONTACTS_TABLE_NAME = "SalaryDetails";
    public DatabaseHelper(Context context) {
        super(context,DATABASE_NAME,null,1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
            "create table "+ CONTACTS_TABLE_NAME +"(id integer primary key NOT NULL UNIQUE , name text  NOT NULL UNIQUE,salary text NOT NULL)"
        );
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+CONTACTS_TABLE_NAME);
        onCreate(db);
    }
   public boolean insert(String s, String s1) {
      SQLiteDatabase db = this.getWritableDatabase();
      ContentValues contentValues = new ContentValues();
      contentValues.put("name", s);
      contentValues.put("salary", s1);
      db.insert(CONTACTS_TABLE_NAME, null, contentValues);
      return true;
   }
}

ここでのポイントは、onCreate()メソッド内のCREATE TABLE文です。「id integer primary key NOT NULL UNIQUE」および「name text NOT NULL UNIQUE」のようにUNIQUE制約を指定することで、idカラムとnameカラムに重複した値が登録されなくなります。例えば、すでに存在する同じ名前のデータを再度挿入しようとした場合、SQLiteが制約違反として処理するため、テーブル内のデータの一意性が自動的に保たれます。

アプリを実行して動作を確認する

それでは実際にアプリを起動してみましょう。実機のAndroid端末をパソコンに接続しているものとします。Android Studioでプロジェクトのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。接続中のモバイルデバイスを選択すると、端末に以下のような初期画面が表示されます。

【Android】SQLiteでUNIQUE制約を使って重複データを防ぐ方法

次に、下図のように名前と給与を入力してボタンをタップします。

【Android】SQLiteでUNIQUE制約を使って重複データを防ぐ方法

実行結果を検証するには、Android Studio側でデータベースの中身を確認します。下図のように、UNIQUE制約によって同じnameの行が重複登録されていないことが確認できます。

【Android】SQLiteでUNIQUE制約を使って重複データを防ぐ方法

  1. Android SQLiteでMAX()関数を使う方法を徹底解説!実装サンプルコード付き

    はじめに:AndroidにおけるSQLiteデータベースとは 具体的な例に入る前に、AndroidにおけるSQLiteデータベースについて簡単に確認しておきましょう。SQLiteは、デバイス上のテキストファイルにデータを保存するオープンソースのSQLデータベースです。Androidには標準でSQLiteデータベースの実装が組み込まれており、リレーショナルデータベースの機能をすべてサポートしています。 また、このデータベースにアクセスする際、JDBCやODBCのような接続設定は一切不要という点も大きな特徴です。 本記事では、Android SQLiteでMAX()関数を使用して最大値(最高給与)

  2. AndroidのSQLiteでSUM()関数を使って合計値を取得する方法【サンプルコード付き】

    SQLiteデータベースとは具体的な実装例に入る前に、AndroidにおけるSQLiteデータベースの基礎知識をおさらいしておきましょう。SQLiteはオープンソースのSQLデータベースエンジンで、デバイス内のテキストファイル形式でデータを保存します。Androidには標準でSQLiteの実装が組み込まれており、追加のライブラリなしですぐに利用できます。SQLiteはリレーショナルデータベースの主要な機能を一通りサポートしており、JDBCやODBCのような接続ドライバーを用意する必要がない点も大きな特徴です。アプリ内から直接アクセスできる手軽さが、Android開発で広く使われる理由です。本記