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

AndroidのSQLiteでNOT NULL制約を使用する方法を徹底解説

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

SQLiteは、データを端末内のテキストファイルとして保存するオープンソースのSQLデータベースです。Androidには標準でSQLiteの実装が組み込まれており、追加のセットアップなしですぐに利用できます。リレーショナルデータベースの基本的な機能を幅広くサポートしており、JDBCやODBCのように接続を確立する処理も不要なため、モバイルアプリ向けのローカルデータ保存先として非常に人気があります。

NOT NULL制約とは

NOT NULL制約が付いたカラムにはNULL値を挿入できません。氏名や金額といった必須項目の欠落によるデータ不整合を防ぎたい場合に有効な制約です。本記事では、名前と給与を登録する簡単なサンプルアプリを通じて、テーブル作成時にNOT NULL制約を定義する方法をステップごとに解説します。

手順1:新規プロジェクトを作成する

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

手順2:レイアウトファイル(res/layout/activity_main.xml)を編集する

以下のコードを 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 = "名前を入力"
      android:layout_height = "wrap_content" />
   <EditText
      android:id = "@+id/salary"
      android:layout_width = "match_parent"
      android:inputType = "numberDecimal"
      android:hint = "給与を入力"
      android:layout_height = "wrap_content" />
   <Button
      android:id = "@+id/save"
      android:text = "保存"
      android:layout_width = "wrap_content"
      android:layout_height = "wrap_content" />
</LinearLayout>

上記のレイアウトでは、名前と給与を入力するためのEditTextを2つ配置しています。ユーザーが「保存」ボタンをタップすると、そのデータが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 savedInstanceState) {
      super.onCreate(savedInstanceState);
      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, "登録しました", Toast.LENGTH_LONG).show();
               } else {
                  Toast.makeText(MainActivity.this, "登録できませんでした", Toast.LENGTH_LONG).show();
               }
            } else {
               name.setError("名前を入力してください");
               salary.setError("給与を入力してください");
            }
         }
      });
   }
}

保存ボタンがクリックされると、まず入力欄が空でないかをチェックします。未入力の項目があればエラーメッセージを表示し、両方とも入力されていればヘルパークラス経由でINSERT文を実行し、結果をToastで通知します。

※補足:新しいプロジェクトでは、サポートライブラリではなく androidx.appcompat.app.AppCompatActivity の利用が推奨されています。import文を読み替えてください。

手順4:DatabaseHelper.java を実装する(NOT NULL制約の定義)

続いて、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, name text NOT NULL,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」「name」「salary」の各カラムにNOT NULLを指定することで、これらのカラムにNULL値が挿入されるのをデータベースレベルで防いでいます。また、onUpgrade()ではテーブル構造の変更時に既存テーブルを削除して再作成する処理を行っています。

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

それでは実際にアプリを動かしてみましょう。実機のAndroidスマートフォンをPCに接続し、Android Studioでアクティビティファイルを開いてツールバーの「Run」アイコンをクリックします。接続したデバイスを選択すると、端末に初期画面が表示されます。

AndroidのSQLiteでNOT NULL制約を使用する方法を徹底解説

次に、以下のように名前と給与の値を入力して「保存」ボタンをタップします。

AndroidのSQLiteでNOT NULL制約を使用する方法を徹底解説

登録結果は、Android Studioの画面(LogcatやDatabase Inspector)で以下のように確認できます。

AndroidのSQLiteでNOT NULL制約を使用する方法を徹底解説

  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開発で広く使われる理由です。本記