Trước tiên các bạn tạo file res/menu/tasks_fragment.xml
với nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"utf-8"</span><span class="hljs-meta">?></span></span> <span class="hljs-tag"><<span class="hljs-name">menu</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span> <span class="hljs-attr">xmlns:app</span>=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span>></span> <span class="hljs-tag"><<span class="hljs-name">item</span> <span class="hljs-attr">android:title</span>=<span class="hljs-string">"@string/action_add_task"</span> <span class="hljs-attr">android:icon</span>=<span class="hljs-string">"@android:drawable/ic_menu_add"</span> <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/action_add_task"</span> <span class="hljs-attr">app:showAsAction</span>=<span class="hljs-string">"always"</span> /></span> <span class="hljs-tag"></<span class="hljs-name">menu</span>></span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onOptionsItemSelected</span><span class="hljs-params">(MenuItem item)</span> </span>{ <span class="hljs-keyword">int</span> id = item.getItemId(); <span class="hljs-keyword">switch</span> (id){ <span class="hljs-keyword">case</span> R.id.action_add_task: AlertDialog.Builder builder = <span class="hljs-keyword">new</span> AlertDialog.Builder(getActivity()); builder.setTitle(<span class="hljs-string">"Add a task"</span>); <span class="hljs-keyword">final</span> EditText inputField = <span class="hljs-keyword">new</span> EditText(getActivity()); builder.setView(inputField); builder.setPositiveButton(<span class="hljs-string">"Add"</span>, <span class="hljs-keyword">new</span> DialogInterface.OnClickListener() { <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span><span class="hljs-params">(DialogInterface dialogInterface, <span class="hljs-keyword">int</span> i)</span> </span>{ Toast.makeText(getActivity(), inputField.getText(), Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton(<span class="hljs-string">"Cancel"</span>, <span class="hljs-keyword">null</span>); builder.create().show(); <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>; } <span class="hljs-keyword">return</span> <span class="hljs-keyword">super</span>.onOptionsItemSelected(item); } |
Khi click vào +
button ta sẽ thấy AlertDialog sau hiển thị
II. Lưu trữ và nhận dữ liệu từ Database
1. Tạo database
1.1 Tạo package data
như ảnh dưới đây
1.2 Tạo file TaskConTract trong package data
Contract trong file này giúp app có khả năng làm việc với các URIs, tên cột trong bảng, intent actions, và các features của content provider.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="hljs-keyword">package</span> sonyama.todolist.data; <span class="hljs-keyword">import</span> android.provider.BaseColumns; <span class="hljs-comment">/** * Created by sonyama on 1/11/16. */</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TaskConTract</span> </span>{ <span class="hljs-comment">//Each of xxxEntry corresponds to a table in the database</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TaskEntry</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">BaseColumns</span> </span>{ <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TABLE_NAME = <span class="hljs-string">"tasks"</span>; <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String COLUMN_TASK = <span class="hljs-string">"task"</span>; } } |
1.3 Tạo TaskDBHelper
Và sử dụng nó để tạo database theo yêu cầu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<span class="hljs-keyword">package</span> sonyama.todolist.data; <span class="hljs-keyword">import</span> android.content.Context; <span class="hljs-keyword">import</span> android.database.sqlite.SQLiteDatabase; <span class="hljs-keyword">import</span> android.database.sqlite.SQLiteOpenHelper; <span class="hljs-comment">/** * Created by sonyama on 1/11/16. */</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TaskDBHelper</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">SQLiteOpenHelper</span> </span>{ <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String DATABASE_NAME = <span class="hljs-string">"tasks.db"</span>; <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> DATABASE_VERSION = <span class="hljs-number">1</span>; <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">TaskDBHelper</span><span class="hljs-params">(Context context)</span> </span>{ <span class="hljs-keyword">super</span>(context, DATABASE_NAME, <span class="hljs-keyword">null</span>, DATABASE_VERSION); } <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span><span class="hljs-params">(SQLiteDatabase db)</span> </span>{ <span class="hljs-keyword">final</span> String SQL_CREATE_TASKS_TABLE = <span class="hljs-string">"CREATE TABLE "</span> + TaskConTract.TaskEntry.TABLE_NAME + <span class="hljs-string">" ("</span> + TaskConTract.TaskEntry._ID + <span class="hljs-string">" INTEGER PRIMARY KEY,"</span> + TaskConTract.TaskEntry.COLUMN_TASK + <span class="hljs-string">" TEXT NOT NULL"</span> + <span class="hljs-string">" );"</span>; db.execSQL(SQL_CREATE_TASKS_TABLE); } <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onUpgrade</span><span class="hljs-params">(SQLiteDatabase db, <span class="hljs-keyword">int</span> oldVersion, <span class="hljs-keyword">int</span> newVersion)</span> </span>{ db.execSQL(<span class="hljs-string">"DROP TABLE IF EXISTS "</span> + TaskConTract.TaskEntry.TABLE_NAME); onCreate(db); } } |
2. Đọc ghi dữ liệu vào database
2.1 Ghi dữ liệu
Chúng ta sẽ chỉnh sửa code ở MainActivityFragment.java
sao cho khi click vào nút +
ta có thể nhập tên task muốn làm và lưu vào một bản ghi trong database.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onOptionsItemSelected</span><span class="hljs-params">(MenuItem item)</span> </span>{ <span class="hljs-keyword">int</span> id = item.getItemId(); <span class="hljs-keyword">switch</span> (id){ <span class="hljs-keyword">case</span> R.id.action_add_task: AlertDialog.Builder builder = <span class="hljs-keyword">new</span> AlertDialog.Builder(getActivity()); builder.setTitle(<span class="hljs-string">"Add a task"</span>); builder.setMessage(<span class="hljs-string">"What do you want to do"</span>); <span class="hljs-keyword">final</span> EditText inputField = <span class="hljs-keyword">new</span> EditText(getActivity()); builder.setView(inputField); builder.setPositiveButton(<span class="hljs-string">"Add"</span>, <span class="hljs-keyword">new</span> DialogInterface.OnClickListener() { <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span><span class="hljs-params">(DialogInterface dialogInterface, <span class="hljs-keyword">int</span> i)</span> </span>{ <span class="hljs-comment">//Get user input</span> String inputTask = inputField.getText().toString(); <span class="hljs-comment">//Get DBHelper to write to database</span> TaskDBHelper helper = <span class="hljs-keyword">new</span> TaskDBHelper(getActivity()); SQLiteDatabase db = helper.getWritableDatabase(); <span class="hljs-comment">//Put in the values within a ContentValues</span> ContentValues values = <span class="hljs-keyword">new</span> ContentValues(); values.clear(); values.put(TaskConTract.TaskEntry.COLUMN_TASK, inputTask); <span class="hljs-comment">//Insert the values into the Table for Tasks</span> db.insertWithOnConflict( TaskConTract.TaskEntry.TABLE_NAME, <span class="hljs-keyword">null</span>, values, SQLiteDatabase.CONFLICT_IGNORE ); <span class="hljs-comment">//Query database again to get updated data</span> Cursor cursor = db.query(TaskConTract.TaskEntry.TABLE_NAME, <span class="hljs-keyword">new</span> String[]{TaskConTract.TaskEntry._ID, TaskConTract.TaskEntry.COLUMN_TASK}, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>); <span class="hljs-comment">//Swap old data with new data for display</span> mTaskAdapter.swapCursor(cursor); } }); builder.setNegativeButton(<span class="hljs-string">"Cancel"</span>, <span class="hljs-keyword">null</span>); builder.create().show(); <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>; } <span class="hljs-keyword">return</span> <span class="hljs-keyword">super</span>.onOptionsItemSelected(item); } |
2.2 Xoá dữ liệu
Tạo file TaskAdapter.java với nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<span class="hljs-keyword">package</span> sonyama.todolist; <span class="hljs-keyword">import</span> ... <span class="hljs-keyword">import</span> sonyama.todolist.data.TaskConTract; <span class="hljs-keyword">import</span> sonyama.todolist.data.TaskDBHelper; <span class="hljs-comment">/** * Created by sonyama on 1/12/16. */</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TaskAdapter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">CursorAdapter</span> </span>{ <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Context context; TaskDBHelper helper; <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">TaskAdapter</span> <span class="hljs-params">(Context context, Cursor cursor)</span> </span>{ <span class="hljs-keyword">super</span>(context, cursor, <span class="hljs-number">0</span>); <span class="hljs-keyword">this</span>.context = context; helper = <span class="hljs-keyword">new</span> TaskDBHelper(context); } <span class="hljs-comment">//The newView method is used to inflate a new view and return it,</span> <span class="hljs-comment">//you don't bind any data to the view at this point</span> <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> View <span class="hljs-title">newView</span><span class="hljs-params">(Context context, Cursor cursor, ViewGroup parent)</span> </span>{ <span class="hljs-keyword">return</span> LayoutInflater.from(context).inflate(R.layout.list_item_task, parent, <span class="hljs-keyword">false</span>); } <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">bindView</span><span class="hljs-params">(View view, Context context, Cursor cursor)</span> </span>{ <span class="hljs-comment">//Find Views to populate in inflated template</span> TextView textView = (TextView) view.findViewById(R.id.list_item_task_textview); Button done_button = (Button) view.findViewById(R.id.list_item_task_done_button); <span class="hljs-comment">//Extract properties from cursor</span> <span class="hljs-keyword">final</span> String id = cursor.getString(MainActivityFragment.COL_TASK_ID); <span class="hljs-keyword">final</span> String task = cursor.getString(MainActivityFragment.COL_TASK_NAME); <span class="hljs-comment">//Populate views with extracted properties</span> textView.setText(task); done_button.setOnClickListener(<span class="hljs-keyword">new</span> View.OnClickListener() { <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span><span class="hljs-params">(View v)</span> </span>{ <span class="hljs-comment">//Create a SQL command for deleting a particular ID.</span> String sql = String.format(<span class="hljs-string">"DELETE FROM %s WHERE %s = '%s'"</span>, TaskConTract.TaskEntry.TABLE_NAME, TaskConTract.TaskEntry._ID, id); SQLiteDatabase sqlDB = helper.getWritableDatabase(); <span class="hljs-comment">//Execute the delete command</span> sqlDB.execSQL(sql); Log.d(<span class="hljs-string">"kakakak"</span>, <span class="hljs-string">"kekekek"</span>); notifyDataSetChanged(); <span class="hljs-comment">//Query database for updated data</span> Cursor cursor = sqlDB.query(TaskConTract.TaskEntry.TABLE_NAME, <span class="hljs-keyword">new</span> String[]{TaskConTract.TaskEntry._ID, TaskConTract.TaskEntry.COLUMN_TASK}, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>); <span class="hljs-comment">//Instance method with TaskAdapter so no need to use adapter.swapCursor()</span> swapCursor(cursor); } }); } } |