SQLite Trong Android (Phần 1)

SQLite Trong Android

Phần 1: Giới thiệu, Cấu hình, Thao tác thêm và Lấy dữ liệu trong SQLite.

1. Giới thiệu.

Khi thực hiện một ứng dụng, việc chọn nền tảng Cơ sở dữ liệu (CSDL) là một việc khá quan trọng. Chọn được cơ sở dữ liệu phù hợp với ứng dụng, sẽ giúp ứng dụng của chúng ta hoạt động dễ dàng và trơn tru hơn.

Hiện nay, có khá nhiều CSDL để bạn có thể sử dụng cho việc lưu trữ trên ứng dụng của mình như Web Service, Firebase,… và SQLite là một trong số đó.

SQLite là một cơ sở dữ liệu quan hệ, mã nguồn mở và được tích hợp sẵn trên Android.

SQLite thường được sử dụng trong các ứng dụng ở Local, như các ứng dụng Danh bạ, Tin nhắn, Ghi chú, Quản lý thông tin cá nhân, Các tùy chọn thiết lập (Setting) trong phần mềm,…v….v

2. Cấu hình SQLite.

Vậy là phần chém gió đầu tiên đã tạm ổn, giờ mình sẽ hướng dẫn các bạn về việc cấu hình một Database với SQLite

Trước đây, nếu bạn nào đã từng học qua SQL Server thì sẽ rất dễ tiếp cận với SQLite, vì cơ bản các lệnh trong SQLite tương tự như SQL Server. Bây giờ, mình sẽ giới thiệu một vài câu lệnh để các bạn nhớ lại nhé, cũng để các bạn nhớ lại trước khi chúng ta sử dụng SQLite trong Android. Mình sẽ chia các câu lệnh này ra thành 2 nhóm.

1. Nhóm truy vấn KHÔNG trả về dữ liệu:

– Tạo một bảng: Create Ten_bang (Danh_sach_cac_cot Kieu_du_lieu(Kich_thuoc)).

– Xóa một bảng: Drop Table Ten_bang.

– Thêm một dòng vào bảng: Insert Into Ten_bang(Cac_cot) Values (Gia_tri_tuong_ung).

– Sửa một dòng trong bảng: Update Ten_bang Set Gia_tri Where Dieu_kien.

– Xóa một dòng trong bảng: Delete From Ten_bang Where Dieu_kien.

2. Nhóm truy vấn trả về dữ liệu.

– Lấy ra các dòng trong bảng: Select Ten_cot From Ten_bang Where Dieu_kien.

– Lấy ra tất cả dòng trong bảng: Select * From Ten_bang.

Một vài câu lệnh như thế đủ để cho bạn thao tác với SQLite rồi đó!! Tùy vào từng trường hợp mà chúng ta sẽ tùy biến câu lệnh lại sau nhé!!.

Bây giờ, chúng ta sẽ đụng tới Android Studio đây, các bạn hãy tạo một project mới nhé!!.

Sau khi project được tạo, các bạn tạo thêm một Java Class mới và đặt tên là DataSqlite, sau đó các bạn cho nó extends từ SQLiteOpenHelper. Lúc này Class sẽ báo lỗi do thiếu một vài phương thức, các bạn lần lượt tạo một Constructor và 2 phương thức onCreate và onUpgrade cho Class là hết lỗi ngay!!.

Sau khi tạo 3 phương thức trên, Class của bạn sẽ như sau:

class DataSqlite extends SQLiteOpenHelper {

    DataSqlite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

Lúc này, bạn tạo thêm 2 hàm nữa để phục vụ cho việc Truy vấn của chúng ta sau này (nếu quên, có thể xem lại 2 Nhóm các câu lệnh mình đã nói ở trên).

Hàm đầu tiên phục vụ cho việc truy vấn KHÔNG trả về dữ liệu:

void TruyVanKhongTraVe(String sql)
    {
        SQLiteDatabase db=getWritableDatabase();
        db.execSQL(sql);
    }

Hàm thứ 2 phục vụ cho việc truy vấn Trả về dữ liệu. Hàm này sẽ return về một dữ liệu dạng Con trỏ (Cursor):

Cursor TruyVanTraVe(String sql)
    {
        SQLiteDatabase db=getWritableDatabase();
        return db.rawQuery(sql, null);
    }

Như vậy, Class DataSqlite của chúng ta đầy đủ sẽ như sau:

class DataSqlite extends SQLiteOpenHelper {

    DataSqlite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    void TruyVanKhongTraVe(String sql)
    {
        SQLiteDatabase db=getWritableDatabase();
        db.execSQL(sql);
    }

    Cursor TruyVanTraVe(String sql)
    {
        SQLiteDatabase db=getWritableDatabase();
        return db.rawQuery(sql, null);
    }
}

Trong ví dụ này, mình sẽ xây dựng một Demo nhỏ để Quản lý sinh viên, mình sẽ có 1 bảng lưu có 2 trường là IDTenSV, ID mình sẽ cho tự động tăng để các bạn biết thêm cách cho 1 ID tự động tăng trong SQLite.

 Đầu tiên, file activity_main.xml của chúng ta sẽ như sau:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.windows10timt.demosqlite.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tên sinh viên"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/edtTenSV"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Nhập tên sinh viên muốn thêm..."
            android:lines="1" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btnThem"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Thêm" />
        </LinearLayout>

        <ListView
            android:id="@+id/lvDanhsach"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</RelativeLayout>

Tiếp theo, Bạn tạo một Class Java mới có tên ObjectSinhvien để lưu các giá trị của mỗi Sinh viên. Class sau khi tạo như sau:

class ObjectSinhvien {

    Integer maSV;
    String tenSV;

    ObjectSinhvien(Integer maSV, String tenSV) {
        this.maSV = maSV;
        this.tenSV = tenSV;
    }
}

Bây giờ, bạn vào MainActivity để cấu hình tiếp cho SQLite.

Bạn khai báo các thành phần:

    
Button btnThem;
EditText edtTenSV;
ListView lvDanhsach;
    
DataSqlite data;

ArrayList<ObjectSinhvien> arrayData;

DataSqlite chính là tên của Class Java bạn vừa extends từ SQLiteOpenHelper lúc nãy, ngoài ra bạn khai báo thêm một mảng ArrayList để chứa dữ liệu khi ta lấy từ Database lên, các bạn tiến hành ánh xạ các Button, Listview và EditText như bình thường.

Để tạo một database, trong hàm onCreate(), các bạn code như sau:

data = new DataSqlite(MainActivity.this, "Demo.sqlite", null, 1);
data.TruyVanKhongTraVe("Create Table If not exists QuanLySinhVien(ID Integer Primary Key Autoincrement , TenSV Varchar)");

Trong dòng đầu tiên, Demo.sqlite là tên Database của chúng ta, các bạn nhớ gõ phần đuôi cho chính xác nhé. Ở câu thứ hai, chúng ta gọi hàm TruyVanKhongTraVe do câu lệnh chúng ta dùng là ở Nhóm 1 (có thể xem lại 2 Nhóm ở trên), “If not exists” có nghĩa là nếu bảng với tên QuanLySinhVien đã tồn tại rồi thì chúng ta không tạo nữa, “Autoincrement” là câu lệnh để cột ID tự động tăng trong Database. Sau khi câu lệnh 2 chạy, một bảng với tên QuanLySinhVien sẽ được tạo.

3. Thêm dữ liệu vào bảng.

Sau khi có bảng rồi, công việc tiếp theo của chúng ta là thêm dữ liệu vào bảng này, dữ liệu chúng ta sẽ nhập vào từ edtTenSV đã tạo ở activity_main.xml

Để thêm một dòng mới vào bảng QuanLySinhVien, chúng ta gọi sự kiện Click của btnThem:

btnThem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!edtTenSV.getText().toString().trim().equals("")) {
                    data.TruyVanKhongTraVe("Insert into QuanLySinhVien values (null, '" + edtTenSV.getText().toString().trim() + "')");
                    Toast.makeText(MainActivity.this, "Thêm thành công sinh viên " + edtTenSV.getText().toString(), Toast.LENGTH_SHORT).show();
                    edtTenSV.setText("");
                } else {
                    Toast.makeText(MainActivity.this, "Hãy nhập tên sinh viên!!", Toast.LENGTH_SHORT).show();
                }
            }
        });

Trong sự kiện Click này, chúng ta gọi hàm TruyVanKhongTraVe và sử dụng câu lệnh Insert để tiến hành Thêm, các bạn lưu ý là với chuỗi thì chúng ta sẽ có thêm một cặp dấu ‘ ‘ ở phía ngoài nữa nhé, và do trường ID là tự tăng nên các bạn gõ null nhé!!!.

4. Lấy dữ liệu từ bảng.

Sau khi đã có dữ liệu trong bảng, chúng ta tiến hành lấy dữ liệu lên:

private void LoadData() {
    arrayData = new ArrayList<>();
    Cursor cursor = data.TruyVanTraVe("Select * From QuanLySinhVien");
    while (cursor.moveToNext()) {
        arrayData.add(new ObjectSinhvien(cursor.getInt(0), cursor.getString(1)));
    }
    CustomAdapter adapter = new CustomAdapter(MainActivity.this, R.layout.item, arrayData);
    adapter.setNotifyOnChange(true);
    lvDanhsach.setAdapter(adapter);
}

Ở đây mình có Custom lại Listview, nếu bạn nào chưa biết Custom thì có thể xem ở đây:

http://androidcoban.com/custom-listview-trong-android.html

Trong hàm này, các bạn dùng câu lệnh Select (có thể xem lại ở Phần 2) và hàm TruyVanTraVe để lấy dữ liệu từ bảng. Sau khi lấy rồi, chúng ta cho các dữ liệu này vào một Cursor và dùng cấu trúc while để duyệt nó, với mỗi dòng trong Cursor, chúng ta Add một dòng vào ArrayList đã khai báo ở trên. Sau đó các bạn gọi lớp AdaptersetAdapter cho lvDanhsach.

Sau khi có hàm rồi, các bạn gọi vào trong MainActivity và sự kiện click của nút Thêm.

Lúc này MainActivity hoàn chỉnh của chúng ta sẽ như sau:

public class MainActivity extends AppCompatActivity {

    Button btnThem;
    EditText edtTenSV;
    ListView lvDanhsach;

    DataSqlite data;
    ArrayList<ObjectSinhvien> arrayData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AnhXa();
        data = new DataSqlite(MainActivity.this, "Demo.sqlite", null, 1);
        data.TruyVanKhongTraVe("Create Table If not exists QuanLySinhVien(ID Integer Primary Key Autoincrement , TenSV Varchar)");

        LoadData();

        btnThem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!edtTenSV.getText().toString().trim().equals("")) {
                    data.TruyVanKhongTraVe("Insert into QuanLySinhVien values (null, '" + edtTenSV.getText().toString().trim() + "')");
                    Toast.makeText(MainActivity.this, "Thêm thành công sinh viên " + edtTenSV.getText().toString(), Toast.LENGTH_SHORT).show();
                    edtTenSV.setText("");
                    LoadData();
                } else {
                    Toast.makeText(MainActivity.this, "Hãy nhập tên sinh viên!!", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void AnhXa() {
        btnThem = (Button) findViewById(R.id.btnThem);
        edtTenSV = (EditText) findViewById(R.id.edtTenSV);
        lvDanhsach = (ListView) findViewById(R.id.lvDanhsach);
    }

    private void LoadData() {
        arrayData = new ArrayList<>();
        Cursor cursor = data.TruyVanTraVe("Select * From QuanLySinhVien");
        while (cursor.moveToNext()) {
            arrayData.add(new ObjectSinhvien(cursor.getInt(0), cursor.getString(1)));
        }
        CustomAdapter adapter = new CustomAdapter(MainActivity.this, R.layout.item, arrayData);
        adapter.setNotifyOnChange(true);
        lvDanhsach.setAdapter(adapter);
    }
}

Như vậy là mình đã cấu hình và viết xong chức năng thêm cũng như là cách lấy dữ liệu lên từ các bảng!! Ở phần 2 mình sẽ hướng dẫn các bạn tiếp tục với thao tác Sửa Xóa Tìm Kiếm trong SQLite nhé!!

 

Xin Chào Và Hẹn Gặp Lại!!

Nguyễn Linh

Chia sẻ để cùng tiến bộ...