【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」アイコンをクリックします。接続したモバイルデバイスを選択すると、アプリが起動して以下の画面が表示されます。

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

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

-
AndroidのSQLiteでMIN()関数を使う方法をサンプルコード付きで解説
例に入る前に、AndroidにおけるSQLiteデータベースについて簡単におさらいしておきましょう。SQLiteはオープンソースのSQLデータベースで、デバイス上のテキストファイルにデータを保存します。AndroidにはSQLiteデータベースの実装が標準で組み込まれており、リレーショナルデータベースの主要な機能をすべて利用できます。また、JDBCやODBCのような接続設定を行うことなく、手軽にデータベースへアクセスできるのも大きな特徴です。 本記事では、AndroidのSQLiteでMIN()関数を使用する方法を実例とともに解説します。MIN()は指定したカラムの中から最小値を取得できる集計
-
AndroidアプリでSQLiteデータベースを使う方法を徹底解説【CRUD実装の手順】
この記事では、AndroidアプリケーションでSQLiteデータベースを活用する方法を、実際のコード例とともに段階的に解説します。データの追加・一覧表示・更新・削除(CRUD操作)をすべて網羅したサンプルアプリを作成しながら、SQLiteの基本的な使い方をマスターしましょう。全体の流れ本チュートリアルでは、サッカー選手の名前と所属国を管理するシンプルなアプリを題材にします。主な構成要素は以下の通りです。DatabaseHelper:SQLiteOpenHelperを継承し、データベースの作成・管理を行うクラスDataBaseManager:データの挿入・取得・更新・削除を担当するクラスMain