SQLiteデータベースの各操作を知る
自作のアプリからカレンダーの編集画面に移動する
※はじめに
この記事はAndroidアプリの開発が、初心者であるという方のための記事です。
そのため、なるべく複雑な説明は避け、コピー&ペイストですぐに動くものをご紹介します。
JavaやAndroidを理解されている方で細かい説明が必要な方は、当ブログ内の連載記事である「Android Tips」をご覧ください。
今回はSQLiteを用いたアプリです。
下図のように各ボタンを押下すると、登録、更新、削除、すべて削除といった各処理を実行します。
アプリの操作
- 登録
- 「名前」と「年齢」を入力
- 「登録ボタン」を押下
- 「データベースの中身を閲覧」ボタンを押下すると、入力した名前と年齢が登録されていることがわかる。
- 更新
- 「データベースに存在している名前」と「年齢」を入力
- 「更新ボタン」を押下
- 「データベースの中身を閲覧」ボタンを押下すると、該当の名前の年齢が更新されていることがわかる。
- 選択削除
- 「データベースに存在している名前」を入力
- 「削除ボタン」を押下
- 「データベースの中身を閲覧」ボタンを押下すると、該当の名前と年齢が削除されていることがわかる。
- すべて削除
- 「すべて削除ボタン」を押下
- 「データベースの中身を閲覧」ボタンを押下すると、テーブル内のすべてのデータが削除されていることがわかる。
アプリ情報
アプリ完成図
MainActivity.java(ソースコード)
activity_main.xmlと紐づきたActivityです。
各ボタンを押下したときの処理を記述しています。
package com.example.sqlitesample1; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyOpenHelper helper = new MyOpenHelper(this); final SQLiteDatabase db = helper.getWritableDatabase(); final EditText nameText = (EditText) findViewById(R.id.editName); final EditText ageText = (EditText) findViewById(R.id.editAge); Button entryButton = (Button) findViewById(R.id.insert); entryButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String name = nameText.getText().toString(); String age = ageText.getText().toString(); ContentValues insertValues = new ContentValues(); insertValues.put("name", name); insertValues.put("age", age); long id = db.insert("person", name, insertValues); } }); Button updateButton = (Button) findViewById(R.id.update); updateButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String name = nameText.getText().toString(); String age = ageText.getText().toString(); if (name.equals("")) { Toast.makeText(MainActivity.this, "名前を入力してください。", Toast.LENGTH_SHORT).show(); } else { ContentValues updateValues = new ContentValues(); updateValues.put("age", age); db.update("person", updateValues, "name=?", new String[] { name }); } } }); Button deleteButton = (Button) findViewById(R.id.delete); deleteButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String name = nameText.getText().toString(); String age = ageText.getText().toString(); if (name.equals("")) { Toast.makeText(MainActivity.this, "名前を入力してください。", Toast.LENGTH_SHORT).show(); } else { db.delete("person", "name=?", new String[] { name }); } } }); Button deleteAllButton = (Button) findViewById(R.id.deleteAll); deleteAllButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String name = nameText.getText().toString(); String age = ageText.getText().toString(); db.delete("person", null, null); } }); Button detaBaseButton = (Button) findViewById(R.id.dataBase); detaBaseButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent dbIntent = new Intent(MainActivity.this, ShowDataBase.class); startActivity(dbIntent); } }); } }
MyOpenHelper.java
SQLiteOpenHelperを継承したクラスで、SQLiteデータベースを生成しているActivityです。
レイアウトファイルとは紐づけていないので、目には見えません。
package com.example.sqlitesample1; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context) { super(context, "NameAgeDB", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table person(" + " name text not null," + "age text" + ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
ShowDataBase.java
show_database.xmlと紐づいたActivityです。
データベースの中身を表示させるための処理を記述しています。
package com.example.sqlitesample1; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.TextView; public class ShowDataBase extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.show_database); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); MyOpenHelper helper = new MyOpenHelper(this); SQLiteDatabase db = helper.getReadableDatabase(); // queryメソッドの実行例 Cursor c = db.query("person", new String[] { "name", "age" }, null, null, null, null, null); boolean mov = c.moveToFirst(); while (mov) { TextView textView = new TextView(this); textView.setText(String.format("%s : %d歳", c.getString(0), c.getInt(1))); mov = c.moveToNext(); layout.addView(textView); } c.close(); db.close(); } }
activity_main.xml
アプリ起動時に表示されるメイン画面です。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="名前と年齢を入力してください。" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/textView1" android:text="名前" /> <EditText android:id="@+id/editName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/textView2" android:ems="10" android:inputType="textPersonName" > <requestFocus /> </EditText> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/editName" android:text="年齢" /> <EditText android:id="@+id/editAge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/textView3" android:ems="10" android:inputType="number" /> <Button android:id="@+id/insert" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/editAge" android:text="登録" /> <Button android:id="@+id/update" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/editAge" android:layout_toRightOf="@+id/insert" android:text="更新" /> <Button android:id="@+id/delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/update" android:layout_alignBottom="@+id/update" android:layout_toRightOf="@+id/update" android:text="削除" /> <Button android:id="@+id/deleteAll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/delete" android:layout_alignBottom="@+id/delete" android:layout_alignParentRight="true" android:layout_toRightOf="@+id/delete" android:text="すべて削除" /> <Button android:id="@+id/dataBase" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:text="データベースの中身を閲覧" /> </RelativeLayout>
show_database.xml
データベースの内容を閲覧するための画面です。
このファイル自体には何もしていませんが、ShowDataBase.javaの中に記述しているレイアウトはこの画面にセットされます。
<?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" > </LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.sqlitesample1" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.sqlitesample1.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MyOpenHelper" > </activity> <activity android:name=".ShowDataBase"></activity> </application> </manifest>
これでOKです。