androidでsqliteを使用してTODOアプリ(仮)を作成
SQLteを私用することで
テーブルのようにデータを操作できる
画面
1つ目はリスト形式で作成
2つ目は登録画面
データベース
DBOpenHelper
package jp.mshige1979.app.sampleapptodo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** */ public class DBOpenHelper extends SQLiteOpenHelper { static final String DB_NAME = "todo.db"; static final int DB_VERSION = 1; public static final String TABLE_NAME = "todo"; protected SQLiteDatabase db; // コンストラクタ public DBOpenHelper(Context context){ //super(context, DB_NAME, null, DB_VERSION); super(context, DB_NAME, null, DB_VERSION); } // 作成 @Override public void onCreate(SQLiteDatabase db){ // create db.execSQL( "CREATE TABLE " + TABLE_NAME + "("+ " _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "+ " memo TEXT NOT NULL "+ " "+ ");" ); } // 更新 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME + ";"); onCreate(db); } }
※SQLiteOpenHelperを継承して、onCreateなどを用意する
TodoAdapter
package jp.mshige1979.app.sampleapptodo; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; /** */ public class TodoAdapter { private SQLiteDatabase db; static private DBOpenHelper helper; // コンストラクタ public TodoAdapter(Context context){ helper = new DBOpenHelper(context); db = helper.getWritableDatabase(); } // リストを取得 public Cursor getAllList(){ return db.query(DBOpenHelper.TABLE_NAME, null, null, null, null, null, null); } // 追加 public void insert(String memo){ ContentValues values = new ContentValues(); values.put("memo", memo); db.insertOrThrow(DBOpenHelper.TABLE_NAME, null, values); } }
※ここでヘルパーのオブジェクトを使用した追加や編集などを制御する
リスト
ここらへんはあまり関係ないけどリスト表示の際に使用する
TodoItem
package jp.mshige1979.app.sampleapptodo; /** */ public class TodoItem { private int _id; private String memo; public void set_id(int _id) { this._id = _id; } public int get_id(){ return this._id; } public void setMemo(String memo) { this.memo = memo; } public String getMemo(){ return this.memo; } }
TodoListAdapter
package jp.mshige1979.app.sampleapptodo; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import java.util.List; /** */ public class TodoListAdapter extends ArrayAdapter<TodoItem> { private LayoutInflater layoutinflater; // コンストラクタ public TodoListAdapter(Context context, int textViewResourceId, List<TodoItem> objects){ super(context, textViewResourceId, objects); layoutinflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { // 指定行のデータを取得 TodoItem detail = (TodoItem)getItem(position); // nullの場合のみ再作成 if(null == convertView){ convertView = layoutinflater.inflate(R.layout.row, null); } // 行のデータを項目へ設定 TextView text1 = (TextView)convertView.findViewById(R.id.textView); text1.setText(String.valueOf(detail.get_id())); TextView text2 = (TextView)convertView.findViewById(R.id.textView2); text2.setText(detail.getMemo()); // 返却 return convertView; } }
res/layout/row.xml
リスト用のレイアウト
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="50dp" android:weightSum="1"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/textView" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/textView2" android:layout_weight="0.08" /> </LinearLayout>
Activity
1つ目の画面
MainActivity
package jp.mshige1979.app.sampleapptodo; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends ActionBarActivity { private TodoAdapter todo; private List<TodoItem> list = new ArrayList<TodoItem>(); private ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { Log.d("activity", "onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); todo = new TodoAdapter(this); Cursor c = todo.getAllList(); if(c.moveToFirst()){ do { TodoItem item = new TodoItem(); item.set_id(c.getInt(c.getColumnIndex("_id"))); item.setMemo(c.getString(c.getColumnIndex("memo"))); list.add(item); } while(c.moveToNext()); } // 紐付け listview = (ListView)findViewById(R.id.listView); // ArrayAdapterへ設定 TodoListAdapter rowAdapater = new TodoListAdapter(this, 0, list); // リストビューへ設定 listview.setAdapter(rowAdapater); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); // メニューボタンを追加 MenuItem item = menu.add("NEW"); item.setIcon(android.R.drawable.ic_input_add); // メニューのイベント定義 item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // インテントのインスタンス生成 Intent intent = new Intent(MainActivity.this, MainActivity2.class); // 次画面のアクティビティ起動 startActivity(intent); return false; } }); // 画面に表示する処理 MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onRestart() { Log.d("activity", "onRestart"); list.clear(); Cursor c = todo.getAllList(); if(c.moveToFirst()){ do { TodoItem item = new TodoItem(); item.set_id(c.getInt(c.getColumnIndex("_id"))); item.setMemo(c.getString(c.getColumnIndex("memo"))); list.add(item); } while(c.moveToNext()); } // 紐付け listview = (ListView)findViewById(R.id.listView); // ArrayAdapterへ設定 TodoListAdapter rowAdapater = new TodoListAdapter(this, 0, list); // リストビューへ設定 listview.setAdapter(rowAdapater); super.onRestart(); } }
2つ目の画面
package jp.mshige1979.app.sampleapptodo; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity2 extends ActionBarActivity { private TodoAdapter todo; private Button btn_back; private Button btn_save; private EditText txt1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_activity2); btn_back = (Button)findViewById(R.id.btn_back); btn_save = (Button)findViewById(R.id.btn_save); txt1 = (EditText)findViewById(R.id.txt1); btn_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 画面を閉じる finish(); } }); btn_save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 値を保存する todo.insert(txt1.getText().toString()); // 画面を閉じる finish(); } }); // todo todo = new TodoAdapter(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main_activity2, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
※2つ目の画面でsaveする際に保存する
結果
所感
ファイル名を指定した場合は保存するけど、ファイル名を未指定の場合は一時ファイルのような扱いになる感じです。
ある程度感じはつかめてきたのでTODOアプリ位なら作成できるようになるかも