ユーザーにゲームを楽しんでもらったあと、その得点をリレーショナルデータベースSQLiteに
記録します。SQLiteはスマートフォンに組み込まれています。
まず、データベースとの接続とテーブルを作成するプログラムファイル(DatabaseHelper)を準備します。
もちろんクラスファイルです。
DatabaseHelperのプログラムコード
package kureishi.example.nationaldefence;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {//スーパークラスSQLiteOpenHelperを継承
private static final String DB_NAME="kurechanSoft"; //データベース名
public static final String TABLE_NAME="score_record"; //テーブル名
private static final int DB_VERSION=1;
public DatabaseHelper(Context context){
super(context,DB_NAME,null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//フィールドはデータ番号_id,日時_date,得点pointです。
String sql="create table "+TABLE_NAME+"(_id integer primary key autoincrement,"+"_date text not null,"+"point integer not null)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion) {
db.execSQL("drop table if exists "+DB_NAME);
onCreate(db);
}
}
ゲーム終了後のユーザの得点はとりあえず表示画面から入力するようにします。データが増えすぎると
困るのでデータの削除も考えます。つまりデータの入力と削除この二つの処理ができるようなシステムを構築
します。
まず、データ番号_id,日時_date,得点pointを受け取るxmlファイル、record_row.xmlを次のように編集します。
android:orientation="horizontal"となっていることに注意して下さい。
このファイルがいったんデータを受け取ります。
これをrecord.xmlファイルのListViewに引渡しスマートフォンに表示するという仕組みのようですね。
record.xmlファイルです。これは相当苦労しました。半日ぐらい。
//ここにデータが表示される。
当然文字列が追加されますのでstring.xmlファイルも追記されます。
strings.xmlファイルです。
NationalDefence
Settings
kurechanSoft
ゲーム開始(Game Start)
御自身の得点を見る(Show My Point)
お友達の得点を見る(Show Friends Point)
このゲームをお友達と競う(Compete With Friends)
データの保存
得点
保存
削除
データの削除
_id
次にRecordActivityです。
データをリストにして表示するため、ListActivityを継承します。クリックボタンからの実行は
今回はインターフェイスOnClickListenerを搭載しプログラミングしやすいようにします。
xmlファイルのボタンをオブジェクトにしています。
onResume(画面がスマートフォンの一番前に来たとき)のとき
DatabaseHelperのインスタンスを作成してデータベースと接続し、テーブルを作成し、データの
読み込みからListViewへの表示を実行しています。
得点を入力し保存ボタンをクリックするとデータが入力され新規データも表示されます。
_id番号を入力しクリックするとデータが削除されます。
プログラムコードは次ぎの通りです。システムらしくなってきました。
package kureishi.example.nationaldefence;
import kureishi.example.nationaldefence.R;
import kureishi.example.nationaldefence.DatabaseHelper;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.app.ListActivity;
import android.content.ContentValues;
import java.util.Calendar;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.View.OnClickListener;
import android.widget.*;
public class RecordActivity extends ListActivity implements OnClickListener{
private boolean mIsNew=true;
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private SimpleCursorAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.record);//record.xmlファイルにしたがって表示すると言う意味です。
//クリックボタンのオブジェクト作成
Button btnSave=(Button)findViewById(R.id.button_save);
Button btnDelete=(Button)findViewById(R.id.button_delete);
btnSave.setOnClickListener(this);
btnDelete.setOnClickListener(this);
}
@Override
protected void onResume(){
super.onResume();
mDbHelper =new DatabaseHelper(this);
mDb=mDbHelper.getWritableDatabase();
//データの読み込み
Cursor c=fetchAll();
//record_row.xmlファイルへセット
startManagingCursor(c);
String[] from=new String[]{"_id","_date","point"};
int[] to=new int[]{R.id._id,R.id._date,R.id.point};
mAdapter=new SimpleCursorAdapter(this,R.layout.record_row,c,from,to);
//record.xmlファイルに表示
setListAdapter(mAdapter);
}
private Cursor fetchAll(){
String[] cols={"_id","_date","point"};
return mDb.query(mDbHelper.TABLE_NAME,cols,null,null,null,null,"_id");
}
@Override
protected void onPause(){
super.onPause();
mDb.close();
}
//クリックボタンの処理の条件分岐
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.button_save:
saveTodo();break;
case R.id.button_delete:
deleteTodo();break;
default:
break;
}
}
//データの保存メソッド
private void saveTodo(){
Calendar calendar=Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DATE);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
String _date="日時/"+year+"/"+month+"/"+day+"/"+hour+"/"+minute+"/";
EditText edit02=(EditText)findViewById(R.id.editText2);
int point=Integer.parseInt(edit02.getText().toString());
ContentValues values=new ContentValues();
values.put("_date",_date);
values.put("point",point);
mDb.insert(mDbHelper.TABLE_NAME, null,values);mDb.close();onResume();
}
//データ削除のメソッド
private void deleteTodo(){
EditText editID=(EditText)findViewById(R.id.editText1);
int point1=Integer.parseInt(editID.getText().toString());
long rr=mDb.delete(mDbHelper.TABLE_NAME,"_id = " + point1,null);mDb.close();onResume();
}
}
スマートフォンの下のほうに入力したデータが表示されます。削除もOK