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"を入力します。
![](https://resources.ipentec.com/document/image/android-sqlite-simple-word-list-application-22?width=600)
=
次へボタンのプロパティです。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