[Android] Sử dụng SQlite -Chương trình quản lý công việc (part 1)
Dựng cấu trúc
1. Tạo
một project mới tên quanlycongviec.
2. Tạo
giao diện chính gồm một TextView và một ListView. Sửa TextView thành quản lý công việc. Ánh xạ nó.
public class QuanLyCongViec extends
SQLiteOpenHelper{
public QuanLyCongViec(Context
context) {
super(context, "quanlycongviec",null, 1);
// TODO
Auto-generated constructor stub
}
@Override
public void
onCreate(SQLiteDatabase db) {
// TODO
Auto-generated method stub
String sql="create table qlcv" +
"(" +
"_id
integer primary key autoincrement," +
"noidung
text," +
"thoigian
text" +
") ";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase
db, int oldVersion, int newVersion) {
// TODO
Auto-generated method stub
db.execSQL("drop
table if exists qlcv");
onCreate(db);
}
}
4.
Tạo
một class mới tên “CongViec” có nội dung như
sau:
public class CongViec {
public int id;
public String noidung;
public String thoigian;
public CongViec(String
nd,String tg)
{
this.noidung=nd;
this.thoigian=tg;
}
public CongViec(int id,String
nd,String tg)
{
this.id=id;
this.noidung=nd;
this.thoigian=tg;
}
}
Tạo menu và activity thêm một công việc
Tao menu item
1.
Eclipse
mới đã tự tạo ra một OptionMenu cho ta, ta chỉ cần thêm dữ liệu (Trong
MainActivity ta thấy đã override onCreateOptionMenu). Mở file activity_main.xml
trong thư mục menu và thêm vào 1 item để được giống
mã bên dưới.
<menu xmlns:android="http://schemas.android.com/apk/res/android"
>
<item
android:id="@+id/menu_settings"
android:orderInCategory="100"
android:title="@string/menu_settings"/>
<item
android:id="@+id/them"
android:title="them cong
viec" />
</menu>
2.
Chạy
chương trình và nhấn vào nút menu xem đã có menu “them” chưa
Tạo activiy them
1.
Tạo
một layout mới tên “activity_themcongviec.xml”.
Có giao diện như hình
2.
Tạo
một class mới tên “ThemCongViec.class” kế thừa từ activity và override lên hàm
onCreate. Gán layout rồi ánh xạ 2 edittext và 1 button.
public class ThemCongViec extends Activity{
EditText et_noidung,et_thoigian;
Button bt;
@Override
protected void onCreate(Bundle
savedInstanceState) {
// TODO
Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_themcongviec);
et_noidung=(EditText)findViewById(R.id.editText1);
et_thoigian=(EditText)findViewById(R.id.editText2);
}
}
3.
Mở
AndroidManifest lên và thêm activity.
<activity
android:name="com.example.quanlycongviec.ThemCongViec"
android:label="@string/app_name"
>
</activity>
4.
Quay
về file chính override lên onOptionsItemSelected và viết như sau:
@Override
public boolean
onOptionsItemSelected(MenuItem item) {
// TODO
Auto-generated method stub
switch(item.getItemId())
{
case R.id.them:
Intent i=
new
Intent(getApplicationContext(),ThemCongViec.class);
startActivityForResult(i,999);
break;
}
return super.onOptionsItemSelected(item);
}
5.
Chạy chương
trình, nhấp menu chọn thêm công việc để xem đã chuyển qua được activity thêm
công việc chưa.
Lấy dữ liệu trả về từ intent, đưa vào database
1.
Mở
file “ThemCongViec.java” (activity ThemCongViec) và viết sự kiện nhấn button và
trả về giá trị.
bt.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v)
{
// TODO
Auto-generated method stub
String noidung=et_noidung.getText().toString();
String thoigian=et_thoigian.getText().toString();
Intent i=new Intent();
i.putExtra("noidung", noidung);
i.putExtra("thoigian", thoigian);
setResult(RESULT_OK,i);
finish();
}
});
2.
Quay
về Activity chính và khai báo biến toàn cục
QuanLyCongViec quanlycongviec;
3.
Trong
hàm onCreate khởi tạo đối tượng
quanlycongviec=new QuanLyCongViec(this);
4.
Override
lên phương thức onActiviyResult. Lấy dữ liệu về và gọi hàm để thêm công việc
vào database.
@Override
protected void
onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO
Auto-generated method stub
super.onActivityResult(requestCode,
resultCode, data);
if(requestCode==999 &&
resultCode==RESULT_OK)
{
String noidung=data.getStringExtra("noidung");
String thoigian=data.getStringExtra("thoigian");
CongViec c=new
CongViec(noidung,thoigian);
quanlycongviec.taoCongViec(c);
}
}
Đọc dữ liệu từ database đưa lên ListView
Hàm lấy công việc trả về ArrayList
1.
Mở
file “QuanLyCongViec.java” và thêm một hàm để lấy tất cả công việc ra
public
ArrayList<CongViec> layCongViec()
{
ArrayList<CongViec> ds_cv=new
ArrayList<CongViec>();
SQLiteDatabase db=this.getReadableDatabase();
Cursor contro=db.rawQuery("select *
from qlcv",null);
contro.moveToFirst();
do
{
int id=Integer.parseInt(contro.getString(0));
String
noidung=contro.getString(1);
String
thoigian=contro.getString(2);
CongViec a=new
CongViec(id,noidung,thoigian);
ds_cv.add(a);
}while(contro.moveToNext());
return ds_cv;
}
Xây dựng ListView
1. Tạo
một file xml mới tên “listview_item.xml” và kéo
vào 3 TextView, TextView đầu tiên có thuộc tính visibility:gone
để không hiển thị (nhưng vẫn tồn tại, nó sẽ chứa id cho dễ quản lý)
<?xml version="1.0"
encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TextView
android:id="@+id/textViewid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large
Text"
android:visibility="gone"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView
android:id="@+id/textViewnoidung"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large
Text"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView
android:id="@+id/textViewthoigian"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Medium
Text"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
</LinearLayout>
2.
Quay
về file java chính khai báo biến toàn cục
ArrayList<CongViec> ds_congviec=new
ArrayList<CongViec>();
3.
Xây
dựng thêm 2 class cục bộ để làm adpater
public static class View_Mot_O
{
TextView id;
TextView noidung;
TextView thoigian;
}
class myadapter extends BaseAdapter{
Context context;
myadapter(Context c)
{
context=c;
}
public int getCount() {
// TODO
Auto-generated method stub
return ds_congviec.size();
}
public Object getItem(int arg0) {
// TODO
Auto-generated method stub
return ds_congviec.get(arg0);
}
public long getItemId(int arg0) {
// TODO
Auto-generated method stub
return arg0;//ds_congviec.get(arg0).id;
}
public View getView(int arg0, View
arg1, ViewGroup arg2) {
// TODO
Auto-generated method stub
View_Mot_O mot_o;
LayoutInflater inf= ((Activity)context).getLayoutInflater();
if(arg1==null)
{
mot_o = new
View_Mot_O();
arg1 = inf.inflate(R.layout.listview_item, null);
mot_o.id=
(TextView)
arg1.findViewById(R.id.textViewid);
mot_o.noidung =
(TextView)arg1.findViewById(R.id.textViewnoidung);
mot_o.thoigian =
(TextView)arg1.findViewById(R.id.textViewthoigian);
arg1.setTag(mot_o);
}
else
mot_o=(View_Mot_O)arg1.getTag();
mot_o.id.setText(ds_congviec.get(arg0).id+"");
mot_o.noidung.setText(ds_congviec.get(arg0).noidung);
mot_o.thoigian.setText(ds_congviec.get(arg0).thoigian);
return arg1;
}
}
4.
Xây
dựng một hàm mới tên “docdulieu” để lấy dữ liệu ra và gán lên listview. Tách
thành hàm rời để tái sử dụng.
public void
docdulieu(Context c)
{
ds_congviec=quanlycongviec.layCongViec();
lv.setAdapter(new myadapter(c));
}
5.
Trong
hàm onCreate sau khi tạo quanlycongviec xong ta gọi hàm đoc dữ liệu đưa lên
listview ở đây dùng try catch để bẫy trường hợp khi lần đầu chạy thì làm gì có
dữ liệu để đọc ra.
quanlycongviec=new QuanLyCongViec(this);
try{
docdulieu(this);
}catch(Exception e)
{
}
6.
Cuối
cùng để cập nhật lại dữ liệu sau mỗi lần thêm thì ta bổ xung trong
onActivityResult
@Override
protected void
onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode,
resultCode, data);
…………………………………………………………………
quanlycongviec.taoCongViec(c);
docdulieu(this);
}
}
7.
Chạy
chương trình, thêm dữ liệu mới và xem kết được cập nhật.
No comments: