SQLite trong Android
White

Minh Tú Anh viết ngày 30/06/2017

Sử dụng SQLite trong Android

tất cả các ví dụ code mình đều giả sử thao tác trên một sơ sở dữ liệu lưu trữ thông tin sinh viên với 5 trường _id, full_name, student_id, gender, year

Đầu tiên, để thao tác với SQLite, ta phải dùng 2 đối tượng

  • SQLiteOpenHelper: đối tượng dùng để tạo, nâng cấp, đóng mở kết nối CSDL
  • SQLiteDatabase: đối tượng dùng để thực thi các câu lệnh SQL trên một CSDL

1. SQLiteOpenHelper

Lớp này có 2 hàm khởi tạo, một hàm 4 tham số, một hàm 5 tham số, tuy nhiên, ta chủ yếu làm việc với hàm 4 tham số

  • Tham số 1: Context context: Context là một lớp trừu tượng của hệ thống, chứa thông tin môi trường ứng dụng, cung cấp các phương thức để có thể tương tác với hệ điều hành, giúp chúng ta dễ dàng truy cập và tương tác tới các tài nguyên của hệ thống...
  • Tham số 2: String name: Tên database
  • Tham số 3: CursorFactory factory: thường để null
  • Tham số 4: Int version: version của database

Khi khởi tạo một đối tượng của lớp này, ta phải ghi đè 2 phương thức

  • onCreate(): phương thức này được gọi bởi framework, nếu có yêu cầu truy cập database mà lại chưa khởi tạo database, ở đây ta phải viết code khởi tạo database, cụ thể là khởi tạo bảng (chú ý: khi khởi tạo bảng, ta phải đặt tên khóa chính là _id)
  • onUpgrade(): phương thức này được dùng khi ứng dụng của bạn có nhiều phiên bản database đc thêm vào. Nó sẽ cập nhật database hiện có hoặc khởi tạo lại thông qua onCreate().

Lớp này có 2 phương thức getReadableDatabase() (chỉ đọc) và getWriteableDatabase() (cho phép ghi đọc). Thông qua 2 phương thức này, ta có thể tạo ra một đối tượng SQLiteDatabase

2. SQLiteDatabase

Lớp này có các phương thức sau để làm việc với SQLite

  • insert()
  • update()
  • delete()
  • execSQL(): thực thi một câu lệnh SQL trực tiếp
  • query(): dùng truy vấn

2.1. query()

Các tham số của phương thức này như sau
alt text
Ta lấy ví dụ dãy tham số thứ 2 cho tổng quát

  • tham số 1 là có cho phép distinct hay không
  • tham số 2 là tên bảng (Chú ý tên bảng và tên databasekhác nhau).
  • tham số 3 là mảng các cột sẽ trả lại, để null nghĩa là trả lại tất cả các cột, để null giống như select *, còn để một mảng giống như select cot1 cot2.
  • tham số 4 là điều kiện, để null nghĩa là không có đk.
  • tham số 9 là limit nghĩa là giới hạn số dòng lấy về.
  • Các tham số còn lại mình không rõ, thường để null, các bạn gg thêm nhé

Câu lệnh truy vấn này trả về một đối tượng Cursor, xem phần riêng về đối tượng Cursor

2.2. insert()

Sử dụng phương thức này để insert một bản ghi vào CSDL
Ví dụ. ta có một đối tượng database thuộc kiểu SQLiteDatabase
Để insert, đầu tiên cần tạo một ContentValue (sẽ giải thích ở phần riêng)

ContentValues ct = new ContentValues();
ct.put("full_name", "Tran Minh Hai");
ct.put("student_id", "20131271");
ct.put("gender", 1);
ct.put("year", 21);

Sau đó insert

database.insert(DATABASE_NAME,null,ct);

2.3. update()

Ví dụ, ta có một đối tượng sinh viên được lưu trữ trong CSDL như sau

  • khóa chính: _id = 2
  • full_name = “Tran Minh Hai”
  • student_id = “20131271”
  • gender = 1
  • year = 21

và một đối tượng SQLiteDatabasesqlDB
Ta muốn update bản ghi này cho year = 22.
Đầu tiên cần lấy ra được bản ghi, sử dụng câu lệnh query()

Cursor cursor = null;
cursor = sqlDB.query(TABLE_NAME, null, "student_id = " + studentID, null, null, null, null);
cursor.moveToFirst();
SinhVien sv = new SinhVien(cursor.getInt(0),cursor.getString(1), cursor.getString(2), cursor.getInt(3), 22);

ở đây, điều quan trọng là ta đã lấy ra được khóa chính _idcursor.getInt(0), sau đó gán cho thuộc tính id của đối tượng sv. Đây chính là điểm mấu chốt giúp ta có được điều kiện update
Tiếp theo, ta thực hiện update

ContentValues ct = new ContentValues();
ct.put("full_name", sv.fullName);
ct.put("student_id", sv.studentID);
ct.put("gender", sv.gender);
ct.put("year", sv.year);
sqlDB.update(TABLE_NAME, ct, "_id = " + sv.id, null );

3. ContentValues

Các đối tượng ContentValues cho phép xác định khóa / giá trị. Các key đại diện nhận dạng cột bảng và value đại diện cho nội dung cho các bảng ghi trong cột này. ContentValues Có thể được sử dụng để chèn và cập nhật các mục cơ sở dữ liệu
Ví dụ:

ContentValues ct = new ContentValues();
ct.put("full_name", "Tran Minh Hai");
ct.put("student_id", "20131271");
ct.put("gender", 1);
ct.put("year", 21);

Full_name, student_id,gender,year là tên các cột, và bên cạnh là giá trị của chúng.
Nếu muốn thêm 2 dòng, ta chỉ cần

ContentValues ct = new ContentValues();
ct.put("full_name", "Tran Minh Hai");
ct.put("student_id", "20131271");
ct.put("gender", 1);
ct.put("year", 21);
ct.put("full_name", "Tran Minh Hai Anh");
ct.put("student_id", "20131272");
ct.put("gender", 0);
ct.put("year", 19);

Chứ không phải tạo ra một đối tượng ContentValue mới, khi đó hàm insert ở trên sẽ trả về số kiểu long là 2

4. Cursor

Đối tượng cursor hiểu đơn giản là một con trỏ, trỏ đến kết quả trả về của câu truy vấn. con trỏ này trỏ đến cái bảng trả về của câu truy vấn
Ví dụ:

Cursor cursor = database.query(TABLE_NAME, null, null, null, null, null, null);

Phương thức cursor.getCount() trả về số dòng của bảng kết quả

Đầu tiên ta di chuyển con trỏ này lên đầu bảng cursor.moveToFirst();
Sau khi đọc xong một dòng chạy lệnh cursor.moveToNext(); để sang dòng tiếp theo
Khi cursor ở cuối bảng, không trỏ vào dòng nào, phương thức cursor.isAfterLast()
Sẽ trả về giá trị true
Để lấy ra thông tin, dung phương thức cursor.getString(), cursor.getInt()

5. Demo

Lý thuyết như thế là đủ, giờ hãy làm một ví dụ demo nhé.
demo mình thiết kế đơn giản chỉ một TextView và hai Button. Khi chạy ứng dụng, sẽ tự động tạo bảng, insert một bản ghi, kích button[getName] thì lấy thông tin full_name ra set lên TextView, kích button[update] thì update thông tin year

Đầu tiên cần tạo lớp MyDBHelper

package com.example.haitm.sqlitedemo;


import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDBHelper extends SQLiteOpenHelper{

    public static final String DATABASE_NAME = "my_db";
    public static final String TABLE_NAME = "sinh_vien";
    public static final int DATABASE_VERSION = 2;

    public MyDBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(" CREATE TABLE " + TABLE_NAME + "(" +
                "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                "full_name VARCHAR(100)," +
                "student_id VARCHAR (8), " +
                "gender INTEGER DEFAULT 1," +
                "year INTEGER )");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

Tạo lớp SinhVien cho từng bản ghi

package com.example.haitm.sqlitedemo;

public class SinhVien {
    public int id;
    public String fullName="";
    public String studentID="";
    public int gender = 0;
    public int year = 0;

    public SinhVien(String fullName, String studentID, int gender, int year) {
        this.fullName = fullName;
        this.studentID = studentID;
        this.gender = gender;
        this.year = year;
    }
    public SinhVien(int id, String fullName, String studentID, int gender, int year) {
        this.id = id;
        this.fullName = fullName;
        this.studentID = studentID;
        this.gender = gender;
        this.year = year;
    }
}

Cuối cùng MainActivity.java

package com.example.haitm.sqlitedemo;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    TextView txtName;
    Button btnGetName, btnUpdate;

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

        txtName = (TextView) findViewById(R.id.textView);
        btnGetName = (Button) findViewById(R.id.button_getname);
        btnUpdate = (Button) findViewById(R.id.button_update);

        MyDBHelper mDB = new MyDBHelper(getApplicationContext());
        final SQLiteDatabase sqlDB = mDB.getWritableDatabase();
        SinhVien sv = new SinhVien(11,"Tran Minh Hai","20131271",1,21);
        ContentValues ct = new ContentValues();
        ct.put("full_name", sv.fullName);
        ct.put("student_id", sv.studentID);
        ct.put("gender", sv.gender);
        ct.put("year", sv.year);
        sqlDB.insert(MyDBHelper.TABLE_NAME, null, ct);

        btnGetName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Cursor cursor = sqlDB.query(MyDBHelper.TABLE_NAME, null, "student_id = 20131271", null, null, null, null, "1");
                cursor.moveToFirst();
                txtName.setText(cursor.getString(1).toString());
            }
        });

        btnUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentValues ct = new ContentValues();
                ct.put("full_name", "Tran Minh Hai");
                ct.put("student_id", "20131271");
                ct.put("gender", 1);
                ct.put("year", 22);
                sqlDB.update(MyDBHelper.TABLE_NAME, ct, "_id = 11", null );
                Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
            }
        });

    }
}

Các bạn có thể down source code của mình trên github về chạy thử nhé
link github: https://github.com/haitm11/SqliteDemo
Tham khảo: http://www.vogella.com/tutorials/AndroidSQLite/article.html

xuxu@minhanh 29-06-2017

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Minh Tú Anh

10 bài viết.
3 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
5 0
Xin chào các bạn. Vào chủ đề chính luôn nhé, hôm nay mình sẽ hướng dẫn các bạn sử dụng fragment trong android. Đây là một thành phần khá quan trọng...
Minh Tú Anh viết 1 năm trước
5 0
White
5 4
Đặt vấn đề mình đang phải đọc một quyển ebook tiếng anh, khổ nỗi tiếng anh thì có hạn. Vì vậy mình thường xuyên phải alt+tab giữa ebook vs google ...
Minh Tú Anh viết 6 ngày trước
5 4
White
4 0
1. Intent là gì ? Intents là một thành phần quan trọng trong android. Nó cho phép các thành phần ứng dụng có thể yêu cầu các hàm từ các thành phần ...
Minh Tú Anh viết 1 năm trước
4 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
10 bài viết.
3 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!