1 mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng...

10
Ver 1.0 2016, FIT - HCMUP Lab 09: SQLite Ths. Lương Trần Hy Hiến, KHOA CNTT TRƯỜNG ĐH SƯ PHẠM TP. HCM 1 1 Mc tiêu Thay vì lưu trữ bằng text file, XML hay SharePreference thì có thể lưu trữ thông tin bằng SQLite. SQLite đã được tích hợp sẵn trong Android SDK. Trong bài lab này ta tìm hiểu và thực hiện: Tạo / xóa một cơ sở dữ liệu SQLite trong Android. Tạo / xóa bảng trong SQLite. Thêm/ sửa/ xóa dữ liệu trong bảng. Truy vấn dữ liệu trong bảng. 2 Thao tác vi CSDL Sqlite 2.1 Cấu trúc database o Bảng Lớp học (tbllop): tbllop Tên ct Kiu dliu Mô tmalop TEXT Khóa chính tenlop TEXT siso INTEGER o Bảng sinh viên (tblsinhvien): tblsinhvien Tên ct Kiu dliu Mô tmasv TEXT Khóa chính tensv TEXT malop TEXT khóa ngoi

Upload: others

Post on 04-Dec-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 1

1 Mục tiêu

Thay vì lưu trữ bằng text file, XML hay SharePreference thì có thể lưu trữ thông tin

bằng SQLite. SQLite đã được tích hợp sẵn trong Android SDK. Trong bài lab này ta tìm

hiểu và thực hiện:

Tạo / xóa một cơ sở dữ liệu SQLite trong Android.

Tạo / xóa bảng trong SQLite.

Thêm/ sửa/ xóa dữ liệu trong bảng.

Truy vấn dữ liệu trong bảng.

2 Thao tác với CSDL Sqlite

2.1 Cấu trúc database

o Bảng Lớp học (tbllop):

tbllop

Tên cột Kiểu dữ liệu Mô tả

malop TEXT Khóa chính

tenlop TEXT

siso INTEGER

o Bảng sinh viên (tblsinhvien):

tblsinhvien

Tên cột Kiểu dữ liệu Mô tả

masv TEXT Khóa chính

tensv TEXT

malop TEXT khóa ngoại

Page 2: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 2

2.2 Tạo/Mở/Đóng CSDL

//Tạo mới CSDL

SQLiteDatabase db = null;

public void CreateDatabase()

{

db = openOrCreateDatabase("QLSV.db", MODE_PRIVATE, null);

}

public void CloseDatabase()

{

if(db.isOpen())

db.close();

} QLSV.db là tên database lưu trong thư mục: /data/data/<package>/databases

2.3 Xóa CSDL

public void DeleteDatabase()

{

String thongbao = "";

if(deleteDatabase("QLSV.db"))

{

thongbao = "Đã xóa thành công QLSV.db!!!";

}

else

{

thongbao = "Không thể xóa QLSV.db!";

}

Toast.makeText(MainActivity.this, thongbao, Toast.LENGTH_SHORT).show();

}

2.4 Tạo bảng lớp

public void CreateTableLop()

{

String sql = "CREATE TABLE Lop(MaLop TEXT PRIMARY KEY, "

+ "TenLop TEXT, siso INTEGER) ";

Page 3: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 3

db.execSQL(sql);

} Lưu ý: Tất cả các thao tác lệnh SQL bao gồm: CREATE, INSERT, UPDATE, DELETE, SELECT

đều có thể thực hiện thông qua phương thức execSQL. Tuy nhiên một số thao tác có phương thức

riêng.

2.5 Class Lop

Để thuận tiện cho các thao tác quản lý, tạo class Lop tương ứng với bảng Lop.

package com.mobileapp.hienlth.mysqlite;

/**

* Created by HIENLTH on 5/27/2016.

*/

public class Lop {

public Lop(String maLop, String tenLop) {

MaLop = maLop;

TenLop = tenLop;

}

public Lop(String maLop, String tenLop, int siSo) {

MaLop = maLop;

SiSo = siSo;

TenLop = tenLop;

}

private String MaLop;

private String TenLop;

private int SiSo;

@Override

public String toString() {

return getMaLop() + " : " + getTenLop() + " : " + getSiSo() + "SV";

}

public String getMaLop() {

return MaLop;

}

public void setMaLop(String maLop) {

MaLop = maLop;

Page 4: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 4

}

public String getTenLop() {

return TenLop;

}

public void setTenLop(String tenLop) {

TenLop = tenLop;

}

public int getSiSo() {

return SiSo;

}

public void setSiSo(int siSo) {

SiSo = siSo;

}

}

2.6 Thêm lớp

Cách thêm một dòng dữ liệu vào trong bảng:

o Dùng đối tượng ContentValues để đưa dữ liệu vào bảng. Đối tượng này có

các phương thức put (tên cột , dữ liệu).

o Sau đó gọi phương thức insert để đưa đối tượng (dòng này) vào bảng.

o Nếu thêm thành công thì sẽ trả về giá trị khác -1. Nếu bằng -1 là thất bại.

Hàm xử lý:

public void AddLop(Lop lop)

{

ContentValues values = new ContentValues();

try {

values.put("MaLop", lop.getMaLop());

values.put("TenLop", lop.getTenLop());

values.put("SiSo", lop.getSiSo());

}catch (Exception ex)

{

Toast.makeText(MainActivity.this, ex.getMessage(), Toast.LENGTH_SHORT).show();

}

Page 5: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 5

if(db.insert("Lop", null, values) == -1)

Toast.makeText(MainActivity.this, "Thất bại", Toast.LENGTH_SHORT).show();

else

Toast.makeText(MainActivity.this, "Thành công!", Toast.LENGTH_SHORT).show();

}

2.7 Sửa lớp

Dùng hàm update để cập nhật dữ liệu theo một điều kiện bất kỳ nào đó.

public int update (String table, ContentValues values, String whereClause, String[]

whereArgs)

o Đối số 1 là tên bảng

o Đối số 2 là đối tượng muốn chính sửa (với giá trị mới)

o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc)

o Đối số 4 là tập các giá trị của điều kiện lọc (lấy theo đúng thứ tự)

Hàm này trả về số dòng bị ảnh hưởng. Ví dụ nếu có 3 dòng bị thay đổi thì nó trả về

3. nếu không có dòng nào bị ảnh hưởng thì nó trả về 0.

Hàm gợi ý:

public void UpdateLop(Lop lop)

{

ContentValues values = new ContentValues();

values.put("TenLop", lop.getTenLop());

values.put("SiSo", lop.getSiSo());

db.update("Lop", values, "MaLop=?", new String[]{lop.getMaLop()});

}

2.8 Xóa lớp

Dùng hàm delete để xóa:

public int delete (String table, String whereClause, String[] whereArgs)

o Đối số 1 là tên bảng

o Đối số 2 là tập điều kiện lọc (dùng ? để tạo)

o Đối số 3 là tập các giá trị của điều kiện lọc

o Hàm trả về số dòng bị ảnh hưởng.

Page 6: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 6

o Muốn xóa toàn bộ dữ liệu trong bảng thì ta truyền null vào 2 đối số cuối:

db.delete("Lop", null, null);

o Muốn xóa theo 1 mã nào đó:

db.delete("Lop", "MaLop=?", new String[]{MaLop});

Code minh họa:

public void XoaLop(String MaLop)

{

//Xóa tất cả

if(MaLop == null)

db.delete("Lop", null, null);

else

db.delete("Lop", "MaLop=?", new String[]{MaLop});

}

2.9 Truy vấn dữ liệu

Sử dụng đối tượng Cursor để duyệt qua tập kết quả truy vấn:

public Cursor query (String table, String[] columns, String selection,

String[] selectionArgs, String groupBy, String having, String orderBy,

String limit)

trong đó:

table : tên bảng truy vấn

columns : danh sách các cột cần lấy.

selection : điều kiện lọc (ví dụ: TenCot = ? hay TenCot1 = ? AND TenCot2 = ?)

selectionArgs : tham số lọc

groupBy : biểu thức GROUPBY

having : biểu thức HAVING

orderBy : biểu thức ORDERBY

limit : số dòng kết quả cần giới hạn.

Các thao tác:

.moveToFirst() : về record đầu

.moveToLast() : về record cuối

.moveToNext() : ra record kế

Page 7: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 7

.isAfterLast() : sau cùng???

.isBeforeFirst() : đầu tiên???

3 Thực nghiệm

3.1 Thiết kế giao diện

3.2 Xử lý sự kiện OnCreate

CreateDatabase();

//Tạo bảng cho lần chạy đầu tiên

// CreateTableLop();

//Thêm vài sinh viên cho lần chạy đầu tiên

//AddLop(new Lop("10A1", "Mười A 1", 22));

//AddLop(new Lop("10A2", "Mười A 2", 32));

//AddLop(new Lop("10A3", "Mười A 3", 25));

adapter = new ArrayAdapter(MainActivity.this,

android.R.layout.simple_list_item_1, dsLop);

Page 8: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 8

lvDSLop.setAdapter(adapter);

loadDBToListView();

3.3 Hàm load dữ liệu đổ vào ListView:

//load database to ListView

public void loadDBToListView()

{

dsLop.clear();

Cursor c = db.query("Lop", null, null, null, null, null, null);

c.moveToFirst();//chuyển về record đầu tiên

String data = "";

while(c.isAfterLast() == false)

{

dsLop.add(new Lop(c.getString(0).toString(),

c.getString(1).toString(),

c.getInt(2)));

c.moveToNext();

}

//Toast.makeText(this, data, Toast.LENGTH_LONG).show();

c.close();

adapter.notifyDataSetChanged();

}

3.4 Sự kiện click lên một Item của ListView

lvDSLop.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

Lop item = (Lop)adapter.getItem(position);

txtMaLop.setText(item.getMaLop());

txtTenLop.setText(item.getTenLop());

txtSiSo.setText(item.getSiSo() + "");

}

});

3.5 Xử lý nút Thêm

btnThem.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Lop lop = new Lop(txtMaLop.getText().toString(),

Page 9: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 9

txtTenLop.getText().toString(),

Integer.parseInt(txtSiSo.getText().toString()));

Toast.makeText(MainActivity.this, lop.toString(), Toast.LENGTH_SHORT).show();

dsLop.add(lop);

AddLop(lop);

loadDBToListView();

}

});

3.6 Xử lý nút Xóa

btnXoa.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

XoaLop(txtMaLop.getText().toString());

loadDBToListView();

}

});

3.7 Xử lý nút Sửa

btnSua.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Lop lop = new Lop(txtMaLop.getText().toString(),

txtTenLop.getText().toString(),

Integer.parseInt(txtSiSo.getText().toString()));

UpdateLop(lop);

loadDBToListView();

}

});

Page 10: 1 Mục tiêu - ptuddd.weebly.com · o Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc) o Đối số 4 là tập các

Ver 1.0 – 2016, FIT - HCMUP Lab 09: SQLite

Ths. Lương Trần Hy Hiến, KHOA CNTT – TRƯỜNG ĐH SƯ PHẠM TP. HCM 10

4 Bài tập

4.1 Tạo bảng SinhVien

4.2 Thực hiện chức năng thêm/xóa/sửa sinh viên