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

【Android】SQLiteでContentValuesを使わずにデータを保存する方法

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

SQLiteは、デバイス上のテキストファイルにデータを保存するオープンソースのSQLデータベースです。AndroidにはSQLiteが標準で組み込まれており、リレーショナルデータベースの機能をすべてサポートしています。また、JDBCやODBCのように特別な接続を確立する必要がなく、手軽に利用できるのが特徴です。

本記事では、ContentValuesクラスを使わずに、SQL構文を直接実行してデータを保存する方法をサンプルコード付きで解説します。

手順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>

このレイアウトでは、名前と給与を入力するための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");
                }
            }
        });
    }
}

「Save」ボタンがクリックされると、まず名前と給与の両方が入力済みかどうかをチェックします。未入力の場合はエラーメッセージを表示し、入力済みであればDatabaseHelperクラスのinsert()メソッドを呼び出してデータを挿入します。処理結果に応じてToastで成功・失敗のメッセージを表示する仕組みです。

手順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 = "salaryDatabase1";
    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 AUTOINCREMENT, name  text,salary text,CHECK (salary> = 10000) )"
        );
    }
    @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();
       db.execSQL("INSERT INTO "+ CONTACTS_TABLE_NAME +"("+"id,name,salary"+")"+" VALUES "+"  ("+"1"+",'"+s+"','"+s1+"')");
       /* ContentValues contentValues = new ContentValues();
       contentValues.put("name", s);
       contentValues.put("salary", s1);
       db.insert(CONTACTS_TABLE_NAME, null, contentValues);*/
       return true;
    }
}

ポイントとなるのはinsert()メソッドです。通常はContentValuesオブジェクトに値を格納してdb.insert()を呼び出しますが、今回はexecSQL()メソッドでINSERT文を直接実行しています。コメントアウト部分が、従来のContentValuesを使った一般的な実装例です。比較することで違いがよく分かります。

注意点:SQLインジェクション対策

文字列連結でSQL文を組み立てる方法は、SQLインジェクションの脆弱性につながる可能性があります。実務では、プレースホルダー(?)を使った次のような安全な書き方を推奨します。

db.execSQL("INSERT INTO " + CONTACTS_TABLE_NAME + "(name, salary) VALUES (?, ?)", new Object[]{s, s1});

アプリの実行と動作確認

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

【Android】SQLiteでContentValuesを使わずにデータを保存する方法

次に、名前と給与を入力して「Save」ボタンをクリックします。

【Android】SQLiteでContentValuesを使わずにデータを保存する方法

保存結果を確認するには、Android Studioの「App Inspection」(旧Database Inspector)機能などでデータベースの中身を参照します。以下のように、入力したデータが正しく登録されていることが分かります。

【Android】SQLiteでContentValuesを使わずにデータを保存する方法

  1. AndroidのSQLiteでMIN()関数を使う方法をサンプルコード付きで解説

    例に入る前に、AndroidにおけるSQLiteデータベースについて簡単におさらいしておきましょう。SQLiteはオープンソースのSQLデータベースで、デバイス上のテキストファイルにデータを保存します。AndroidにはSQLiteデータベースの実装が標準で組み込まれており、リレーショナルデータベースの主要な機能をすべて利用できます。また、JDBCやODBCのような接続設定を行うことなく、手軽にデータベースへアクセスできるのも大きな特徴です。 本記事では、AndroidのSQLiteでMIN()関数を使用する方法を実例とともに解説します。MIN()は指定したカラムの中から最小値を取得できる集計

  2. AndroidアプリでSQLiteデータベースを使う方法を徹底解説【CRUD実装の手順】

    この記事では、AndroidアプリケーションでSQLiteデータベースを活用する方法を、実際のコード例とともに段階的に解説します。データの追加・一覧表示・更新・削除(CRUD操作)をすべて網羅したサンプルアプリを作成しながら、SQLiteの基本的な使い方をマスターしましょう。全体の流れ本チュートリアルでは、サッカー選手の名前と所属国を管理するシンプルなアプリを題材にします。主な構成要素は以下の通りです。DatabaseHelper:SQLiteOpenHelperを継承し、データベースの作成・管理を行うクラスDataBaseManager:データの挿入・取得・更新・削除を担当するクラスMain