SQLiteを利用したシンプルなアプリケーションの作成 - Android

SQLiteを利用し、シンプルなアプリケーションを作成します。

プロジェクトの設定

Android アプリケーションプロジェクトを作成します。プロジェクト名などは以下としました。
  • Project name: SimpleSqliteWord
  • Build Target: Android 2.3
  • Application name: SimpleSqliteWord
  • Package name: com.iPentec.SimpleSqliteWord
  • Activity: MainActivity

プロジェクト作成後の準備

プロジェクトの作成後"EditActivity"を追加します。

Eclipseの"ProjectExplorer"でプロジェクトを選択し、右クリックでポップアップメニューを表示します。[New]メニューの[Other...]サブメニューを選択します。


新規追加ダイアログが表示されます。ダイアログの"Android"カテゴリの"Android Activity"を選択します。選択後[Next]ボタンを押します。


新規アクティビティの作成ダイアログが表示されます。今回はデフォルトの"Blank Activity"を用います。 "Blank Activity"を選択し[Next]ボタンを押します。


Activity名やレイアウト名を指定します。今回はアクティビティ名を"EditActivity"としました。他の項目はActivity名を設定した際に生成される名称をそのまま使うことにしました。


[Finish]ボタンを押してアクティビティの追加を確定します。

UIの作成

MainActivity

MainActivityの画面を以下のデザインとします。TextViewを2つボタンを3つ配置します。


一番上の"Large Text"のTextViewのプロパティを下図のように設定します。多くの項目はデフォルトのままです。


2番目の"Medium Text"のTextViewのプロパティを下図のように設定します。多くの項目はデフォルトのままです。


[意味を表示]のボタンのプロパティは下図の設定となります。


OnClickにもクリック時に呼び出すメソッド名を"buttonShowMean_click"入力します。


前へボタンのプロパティです。OnClickにメソッド名"buttonPrev_click"を入力します。


= 次へボタンのプロパティです。OnClickにメソッド名"buttonNext_click"を入力します。


EditActivity

EditActivityの画面を以下のデザインとします。TextViewを2つ、EditTextを2つボタンを1つ配置します。


Buttonのプロパティを下図に設定します。


OnClickにはクリック時に呼び出すメソッド名"buttonSubmit_Click"を指定します。


TextViewのプロパティは下図とします。



EditTextのプロパティは下図とします。IDが同じになっているかを確認してください。(他の値はデフォルトのままです)


Main.xml の編集 (/res/menu/main.xml)

メニュー要素のXMLを編集します。要素を一つ追加して下図の設定にします。メニュー要素の追加手順についてはこちらの記事を参照してください。


コード

コードは下記になります。
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_settings"/>
    <item android:id="@+id/item1" android:title="単語の追加" android:orderInCategory="101"></item>
</menu>

strings.xml の編集 (/res/values/strings.xml)

/res/values/strings.xml を編集します。追加した要素と値の一覧は下記のコードを参照してください。実際の作業ではUIのデザインを進めながら並行してstrings.xmlを編集します。


コード

コードは下記になります。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SimpleSqliteWord</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="title_activity_edit">EditActivity</string>
    <string name="caption_button_Submit">追加</string>
    <string name="caption_text_word">単語</string>
    <string name="caption_text_mean">意味</string>
    <string name="caption_button_ShowMean">意味を表示</string>
    <string name="caption_button_next">次へ</string>
    <string name="caption_button_prev">前へ</string>
</resources>

コード

下記のコードを記述します。

MainActivity.java

package com.iPentec.simplesqliteword;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
import android.content.*;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import java.util.*;
import android.media.AudioManager;
import android.media.ToneGenerator;

public class MainActivity extends Activity {

  int point=0;
  ArrayList<WordInfo> wlist = new ArrayList<WordInfo>();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.item1:
      Intent intent = new Intent(MainActivity.this, EditActivity.class);
      startActivity(intent);
      return true;
    }
    return false;
  }
  
  @Override
  public void onResume(){
    super.onResume();

    point=0;
    wlist.clear();
    
    // データ取り出し
    AppDBHelper helper = new AppDBHelper(this);
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor c = db.rawQuery("select word, mean from Words order by RANDOM()", null);
    
    boolean isEof = c.moveToFirst();
    while (isEof) {
      WordInfo wi = new WordInfo();
      wi.word = c.getString(0);
      wi.mean = c.getString(1);
      wlist.add(wi);
      isEof = c.moveToNext();
    }
    
    if (wlist.isEmpty() == true){
      TextView textView1 = (TextView)findViewById(R.id.textView1);
      textView1.setText("");
      TextView textView2 = (TextView)findViewById(R.id.textView2);
      textView2.setText("");
     
    }else{
      WordInfo wi = wlist.get(point);
      TextView textView1 = (TextView)findViewById(R.id.textView1);
      textView1.setText(wi.word);
      TextView textView2 = (TextView)findViewById(R.id.textView2);
      textView2.setText("");
    }
  }
  
  public void buttonNext_click(View view){
    if (wlist.size() <= 0) return;
    
    if (wlist.size()-1 <= point){
    }else{
      point++;
    }
    
    WordInfo wi = wlist.get(point);
    TextView textView1 = (TextView)findViewById(R.id.textView1);
    textView1.setText(wi.word);
    TextView textView2 = (TextView)findViewById(R.id.textView2);
    textView2.setText("");
  }

  public void buttonPrev_click(View view){
    if (wlist.size() <= 0) return;
    
    if (point <=0){
    }else{
      point--;
    }
    
    WordInfo wi = wlist.get(point);
    TextView textView1 = (TextView)findViewById(R.id.textView1);
    textView1.setText(wi.word);
    TextView textView2 = (TextView)findViewById(R.id.textView2);
    textView2.setText("");
  }
  
  public void buttonShowMean_click(View view){
    if (wlist.size() <= 0) return;
    
    WordInfo wi = wlist.get(point);
    TextView textView2 = (TextView)findViewById(R.id.textView2);
    textView2.setText(wi.mean);
  
  }
}
解説
onOptionsItemSelected
onOptionsItemSelectedはメニューに関する処理になります。詳しくはこちらの記事を参照してください。メニューが選択された場合はEditActivityの画面を表示します。アクティビティーの切り替えについてはこちらの記事を参照してください。
onResume
onResumeはアクティビティが有効になった際の処理を記述します。今回はデータベースからレコードを取得し最初の一件の単語をTextViewに表示する処理を記述しています。レコードがなかった場合はTextViewの内容を空欄にします。SQLiteのデータベースアクセスに関してはこちらの記事を参照してください。
onResumeはアプリケーション起動時や、アプリケーションの復帰時、単語登録画面(EditActivity)からMainActivityに戻った時にイベントが発生しコードが実行されます。
buttonNext_click
[次へ]ボタンが押された時の処理を記述します。グローバル変数pointを1インクリメントして次のレコードを画面に表示します。
buttonPrev_click
[前へ]ボタンが押された時の処理を記述します。グローバル変数pointを1デクリメントして手前のレコードを画面に表示します。
buttonShowMean_click
[意味を表示]ボタンを押した際の動作を記述します。単語の意味を画面に表示しています。

EditActivity.java

package com.iPentec.simplesqliteword;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import android.widget.Toast;
import android.content.*;
import android.widget.EditText;

public class EditActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.edit, menu);
    return true;
  }

  public void buttonSubmit_Click(View view){
    AppDBHelper helper = new AppDBHelper(this);
    SQLiteDatabase db = helper.getReadableDatabase();

    EditText editText1 = (EditText)findViewById(R.id.editText1);
    String Word = editText1.getText().toString();
    EditText editText2 = (EditText)findViewById(R.id.editText2);
    String Mean = editText2.getText().toString();

    if (Word.length() > 0){
      // データ挿入
      //db.execSQL("insert into Words(word,mean) values ( '" + Word + "' , '" + Mean + "');");
      
      db.beginTransaction();
      try{
      SQLiteStatement stmt = db.compileStatement("insert into Words(word,mean) values (?, ?);");
      stmt.bindString(1, Word);
      stmt.bindString(2, Mean);
 
      stmt.executeInsert();
      db.setTransactionSuccessful();
      }finally{
        db.endTransaction();
      }
  
      Context cx = getApplicationContext();
      Toast ts = Toast.makeText(cx, "単語を挿入しました。", Toast.LENGTH_LONG);
      ts.show();
  
      editText1.setText("");
      editText2.setText("");
    }else{
      Context cx = getApplicationContext();
      Toast ts = Toast.makeText(cx, "単語が空欄です。", Toast.LENGTH_LONG);
      ts.show();   
    }
  }
}
解説
[追加]ボタンが押された時の処理が主なコードです。
EditText(テキストボックス) から値を読み出しテキストボックスに入力された値をSQLiteのデータベースへ挿入しています。EditTextに何も入力されていない場合はデータベースへレコードを挿入しない動作にしています。

AppDBHelper.java

package com.iPentec.simplesqliteword;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class AppDBHelper extends SQLiteOpenHelper{
  public AppDBHelper(Context context) {
    super(context, "mydb.dat", null, 1);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
    // table create
    db.execSQL("CREATE TABLE IF NOT EXISTS Words "
      + "(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , word TEXT , mean TEXT )");
  }
}
解説
DBHelperクラスです。テーブルの作成SQLを記述しています。

WordInfo.java

package com.iPentec.simplesqliteword;

public class WordInfo {
  public String word;
  public String mean;
}
解説
単語と意味を保存するためのクラスです。構造体として使っています。

補足

上記のMainActivity.javaは可読性を良くするため冗長に記述してあります。本来は下記のように記述するとコンパクトになります。
package com.iPentec.simplesqliteword;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
import android.content.*;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import java.util.*;
import android.media.AudioManager;
import android.media.ToneGenerator;


public class MainActivity extends Activity {

  int point=0;
  ArrayList<WordInfo> wlist = new ArrayList<WordInfo>();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.item1:
      Intent intent = new Intent(MainActivity.this, EditActivity.class);
      startActivity(intent);
      return true;
    }
    return false;
  }
  
  @Override
  public void onResume(){
    super.onResume();

    point=0;
    wlist.clear();
    
    // データ取り出し
    AppDBHelper helper = new AppDBHelper(this);
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor c = db.rawQuery("select word, mean from Words order by RANDOM()", null);
    
    boolean isEof = c.moveToFirst();
    while (isEof) {
      WordInfo wi = new WordInfo();
      wi.word = c.getString(0);
      wi.mean = c.getString(1);
      wlist.add(wi);
      isEof = c.moveToNext();
    }
    
    if (wlist.isEmpty() == true){
      DisplayTextView("", "");    
    }else{
      WordInfo wi = wlist.get(point);
      DisplayTextView(wi.word, "");
    }
  }
  
  public void buttonNext_click(View view){
    if (wlist.size() <= 0) return;
    
    if (wlist.size()-1 <= point){
    }else{
      point++;
    }
    
    WordInfo wi = wlist.get(point);
    DisplayTextView(wi.word, "");
  }

  public void buttonPrev_click(View view){
    if (wlist.size() <= 0) return;
    
    if (point <=0){
    }else{
      point--;
    }
    
    WordInfo wi = wlist.get(point);
    DisplayTextView(wi.word, "");
  }
  
  public void buttonShowMean_click(View view){
    if (wlist.size() <= 0) return;
    
    WordInfo wi = wlist.get(point);
    DisplayTextView(wi.word, wi.mean); 
  }
  
  public void DisplayTextView(String d1, String d2){
    TextView textView1 = (TextView)findViewById(R.id.textView1);
    textView1.setText(d1);
    TextView textView2 = (TextView)findViewById(R.id.textView2);
    textView2.setText(d2);  
  }
}

実行結果

プロジェクトを実行します。下図の画面が表示されます。


メニューキー、またはメニューボタンを押します。メニューが表示されますので[単語の追加]ボタンを押します。


画面が切り替わり下図の画面が表示されます。登録する単語と意味を入力して[追加]ボタンを押します。今回は"dog"と"犬"で追加してみました。ボタンを押すとテキストボックスがクリアされ画面の下部にトーストメッセージが表示されます。


"cat","bird"も追加しました。


Backキーを押して最初の画面に戻ると"bird"が画面に表示されます。


[意味を表示]ボタンを押すと単語の下に意味が表示されます。


[次へ]ボタンを押すごとに次の単語が表示されます。


[意味を表示]ボタンを押せばそれぞれの単語の意味が表示されます。

著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2024-01-04
作成日: 2013-03-08
iPentec all rights reserverd.