Header Ads

[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ó.

3.       Tạo một class mới tên “QuanLyCongViec” kế thừa từ SQLiteOpenHelper và thêm nội dung như sau:
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:

Powered by Blogger.