Sử dụng SQLite trong Android

SQLite trong Android giúp bạn thực hiện lưu trữ và truy xuất dữ liệu nhanh gọn, hệ thống cơ sở dữ liệu quan hệ nhỏ gọn khi không cần cấu hình quản trị, câu lệnh truy vấn có nét tương đồng SQL.

SQLite không cần một máy chủ chạy riêng biệt mà bản thân nó thực hiện lưu trữ và truy xuất dữ liệu trực tiếp trên từng thiết bị.

Tại sao nên sử dụng SQLite:

  • SQLite là một hệ cơ sở dữ liệu mã nguồn mở, được tích hợp mặc định trên thiết bị Android.
  • SQLite hỗ trợ cở sở dữ liệu quan hệ.
  • SQLite không cần phải yêu cầu thiết lập cấu hình, cài đặt máy chủ. Hỗ trợ cú pháp lưu trữ và truy vấn cơ sở dữ liệu như SQL thế nên dễ dàng sử dụng.

Ví dụ sử dụng SQLite trong Android:

Sau đây là một ví dụ nhỏ xây dựng ứng dụng giúp bạn lưu trữ thông tin danh bạ với việc sử dụng lưu trữ và truy xuất dữ liệu với SQLite trong Android.

Sử dụng SQLite trong Android

Bước 1: Đầu tiên chúng ta cần tạo lớp Person.java chứa thông tin người dùng như id, name, email

package com.teamvietdev.android.sqlitedatabase.model;

public class Person {

    private long id;
    private String name;
    private String email;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    
}

Sau đó bạn tạo lớp DatabaseHelper và kế thừa lớp SQLiteOpenHelper và ghi đè 2 phương thức onCreate()onUpgrade() như sau:

package com.teamvietdev.android.sqlitedatabase.database;

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

import java.util.ArrayList;
import java.util.List;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "dbname";

    private static final String TABLE_NAME = "tbperson";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_MAIL = "email";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        String value = String.format("CREATE TABLE %s(%s INTEGER PRIMARY KEY, %s TEXT, %s TEXT)", TABLE_NAME, COLUMN_ID, COLUMN_NAME, COLUMN_MAIL);
        db.execSQL(value);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String value = String.format("DROP TABLE IF EXISTS %s", TABLE_NAME);
        db.execSQL(value);
        onCreate(db);
    }

}

Trong đoạn mã chương trình trên bạn sẽ thấy rằng DATABASE_VERSION chính là phiên bản hiện tại của cơ sở dữ liệu, DATABASE_NAME là tên cơ sở dữ liệu, TABLE_NAME là tên bảng và COLUMN_ID, COLUMN_NAME, COLUMN_MAIL là những cột trong bảng.

onCreate() được gọi một lần khi ứng dụng được cài đặt, nó sẽ thực hiện các lệnh để tạo các bảng cần thiết.

onUpgrade() được gọi khi bạn cần cập nhật cơ sở dữ liệu bằng cách sửa đổi thuộc tính DATABASE_VERSION để thực hiện thay đổi.

Lớp SQLiteDatabase là lớp cơ bản dùng để xử lý với SQLite trong Android thực hiện các thao tác CRUD (thêm, sửa, xóa, đọc dữ liệu) vậy chúng ta sẽ áp dụng thực hiện các câu truy vấn.

Lệnh thêm dữ liệu mới vào bảng:

public long create(String name, String mail) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_NAME, name);
        values.put(COLUMN_MAIL, mail);
        long id = db.insert(TABLE_NAME, null, values);
        db.close();
        return id;
}

Sử dụng phương thức insert() để thêm một bản ghi mới vào cơ sở dữ liệu.

Lệnh sửa dữ liệu mới vào bảng:

public int update(long id, String name, String mail) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_NAME, name);
        values.put(COLUMN_MAIL, mail);
        return db.update(TABLE_NAME, values, COLUMN_ID + " = ?",
                new String[]{String.valueOf(id)});
}

Sử dụng phương thức update() để cập nhật một bản ghi trong cơ sở dữ liệu.

Lệnh xóa dữ liệu mới vào bảng:

public void delete(long id) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
        db.close();
}

Sử dụng phương thức delete() để xóa một bản ghi trong cơ sở dữ liệu.

Lệnh truy xuất dữ liệu lấy thông tin một bản ghi:

public Person getValue(long id) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME,
                new String[]{COLUMN_ID, COLUMN_NAME, COLUMN_MAIL}, COLUMN_ID + "=?",
                new String[]{String.valueOf(id)}, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();
        Person person = new Person();
        person.setId(cursor.getInt(cursor.getColumnIndex(COLUMN_ID)));
        person.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
        person.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_MAIL)));
        cursor.close();
        return person;
}

Lệnh truy xuất dữ liệu lấy thông tin danh sách bản ghi:

public List<Person> getAll() {
        List<Person> list = new ArrayList<>();
        String selectQuery = "SELECT  * FROM " + TABLE_NAME;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                Person person = new Person();
                person.setId(cursor.getInt(cursor.getColumnIndex(COLUMN_ID)));
                person.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
                person.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_MAIL)));
                list.add(person);
            } while (cursor.moveToNext());
        }
        db.close();
        return list;
}

Sử dụng phương thức query() hoặc rawQuery() để truy xuất dữ liệu.

Sau khi thêm tất cả các phương thức thì bây giờ lớp DatabaseHelper.java sẽ như sau:

package com.teamvietdev.android.sqlitedatabase.database;

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

import com.teamvietdev.android.sqlitedatabase.model.Person;

import java.util.ArrayList;
import java.util.List;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "dbname";

    private static final String TABLE_NAME = "tbperson";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_MAIL = "email";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        String value = String.format("CREATE TABLE %s(%s INTEGER PRIMARY KEY, %s TEXT, %s TEXT)", TABLE_NAME, COLUMN_ID, COLUMN_NAME, COLUMN_MAIL);
        db.execSQL(value);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String value = String.format("DROP TABLE IF EXISTS %s", TABLE_NAME);
        db.execSQL(value);
        onCreate(db);
    }


    public long create(String name, String mail) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_NAME, name);
        values.put(COLUMN_MAIL, mail);
        long id = db.insert(TABLE_NAME, null, values);
        db.close();
        return id;
    }

    public int update(long id, String name, String mail) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_NAME, name);
        values.put(COLUMN_MAIL, mail);
        return db.update(TABLE_NAME, values, COLUMN_ID + " = ?",
                new String[]{String.valueOf(id)});
    }

    public void delete(long id) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
        db.close();
    }

    public Person getValue(long id) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME,
                new String[]{COLUMN_ID, COLUMN_NAME, COLUMN_MAIL}, COLUMN_ID + "=?",
                new String[]{String.valueOf(id)}, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();
        Person person = new Person();
        person.setId(cursor.getInt(cursor.getColumnIndex(COLUMN_ID)));
        person.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
        person.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_MAIL)));
        cursor.close();
        return person;
    }

    public List<Person> getAll() {
        List<Person> list = new ArrayList<>();
        String selectQuery = "SELECT  * FROM " + TABLE_NAME;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                Person person = new Person();
                person.setId(cursor.getInt(cursor.getColumnIndex(COLUMN_ID)));
                person.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
                person.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_MAIL)));
                list.add(person);
            } while (cursor.moveToNext());
        }
        db.close();
        return list;
    }

}

Bước 2: Bây giờ chúng ta sẽ thiết kế các giao diện màn hình hiển thị, tạo tập tin xml mới có tên là layout_item.xml nhằm thiết kế giao diện hiển thị thông tin tài khoản.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_margin="5dp">

    <TextView
        android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:gravity="center_vertical"
        android:textStyle="bold"
        android:textSize="20dp"
        android:text="Team Việt Dev" />

    <TextView
        android:id="@+id/tvMail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="17dp"
        android:text="teamvietdev@gmail.com" />

</LinearLayout>

Mình sẽ sử dụng RecyclerView để hiển thị dữ liệu danh sách, bạn tạo lớp PersonAdapter.java như sau:

package com.teamvietdev.android.sqlitedatabase.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.teamvietdev.android.sqlitedatabase.R;
import com.teamvietdev.android.sqlitedatabase.model.Person;

import java.util.List;

public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.MyViewHolder> {

    private Context context;
    private List<Person> listPerson;

    public PersonAdapter(Context context, List<Person> listPerson) {
        this.context = context;
        this.listPerson = listPerson;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.layout_item, parent, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Person person = listPerson.get(position);
        holder.tvName.setText(person.getName());
        holder.tvMail.setText(person.getEmail());
    }

    @Override
    public int getItemCount() {
        return listPerson.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        public TextView tvName;
        public TextView tvMail;

        public MyViewHolder(View view) {
            super(view);
            tvName = view.findViewById(R.id.tvName);
            tvMail = view.findViewById(R.id.tvMail);
        }

    }

}

Trong ứng dụng Android hướng dẫn sử dụng SQLite trong Android thì mình sẽ tạo hộp thoại Dialog để thêm, cập nhật hoặc xóa thông tin tài khoản. Chúng ta sẽ thiết kế giao diện với bạn tạo 2 tập tin dialog_person.xml và dialog_delete.xml như sau:

Sử dụng SQLite trong Android

Tập tin dialog_person.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:background="@color/colorPrimary"
        android:textColor="#FFFFFF"
        android:textStyle="bold"
        android:textSize="18dp"
        android:text="THÔNG TIN TÀI KHOẢN"/>

    <EditText
        android:id="@+id/edtName"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="#000000"
        android:textSize="17dp"
        android:hint="Họ và tên"/>

    <EditText
        android:id="@+id/edtEmail"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="#000000"
        android:textSize="17dp"
        android:hint="Địa chỉ Email.."/>

</LinearLayout>

Tập tin dialog_delete.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:background="@color/colorPrimary"
        android:textColor="#FFFFFF"
        android:textStyle="bold"
        android:textSize="18dp"
        android:text="THÔNG BÁO"/>

    <TextView
        android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:gravity="center"
        android:textSize="17dp"
        android:hint="Bạn muốn xóa thông tin người dùng [x] không?"/>

</LinearLayout>

Mở tập tin activity_main.xml và thêm RecyclerView nhằm hiển thị danh sách tài khoản.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@drawable/ic_add_white_24dp" />

</android.support.design.widget.CoordinatorLayout>

Bước 3: Bây giờ bạn mở tập tin MainActivity.java và xử lý

package com.teamvietdev.android.sqlitedatabase.view;

import android.content.DialogInterface;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.teamvietdev.android.sqlitedatabase.R;
import com.teamvietdev.android.sqlitedatabase.adapter.PersonAdapter;
import com.teamvietdev.android.sqlitedatabase.database.DatabaseHelper;
import com.teamvietdev.android.sqlitedatabase.listener.DividerItemDecoration;
import com.teamvietdev.android.sqlitedatabase.listener.RecyclerTouchListener;
import com.teamvietdev.android.sqlitedatabase.model.Person;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private DatabaseHelper db;

    private List<Person> listPerson;
    PersonAdapter mAdapter;

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

        recyclerView = findViewById(R.id.recyclerView);

        db = new DatabaseHelper(this);

        listPerson = new ArrayList<>();
        listPerson = db.getAll();

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showPersonDialog(null, -1);
            }
        });

        mAdapter = new PersonAdapter(this, listPerson);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL, 16));
        recyclerView.setAdapter(mAdapter);

        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this,
                recyclerView, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, final int position) {
                showPersonDialog(listPerson.get(position), position);
            }

            @Override
            public void onLongClick(View view, int position) {
                showDeleteDialog(listPerson.get(position), position);
            }
        }));

    }

    private void create(String name, String mail) {
        long id = db.create(name, mail);
        Person person = new Person();
        person.setId(id);
        person.setName(name);
        person.setEmail(mail);
        listPerson.add(0, person);
        mAdapter.notifyDataSetChanged();
    }

    private void update(int position, long id, String name, String mail) {
        db.update(id, name, mail);
        Person person = new Person();
        person.setId(id);
        person.setName(name);
        person.setEmail(mail);
        listPerson.set(position, person);
        mAdapter.notifyItemChanged(position);
    }

    private void delete(int position, long id) {
        db.delete(id);
        listPerson.remove(position);
        mAdapter.notifyItemRemoved(position);
    }

    private void showPersonDialog(final Person person, final int position) {
        LayoutInflater li = LayoutInflater.from(getApplicationContext());
        View promptsView = li.inflate(R.layout.dialog_person, null);
        final EditText edtName = promptsView.findViewById(R.id.edtName);
        final EditText edtEmail = promptsView.findViewById(R.id.edtEmail);
        if (person != null) {
            edtName.setText(person.getName());
            edtEmail.setText(person.getEmail());
        }
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setView(promptsView);
        alertDialogBuilder
                .setCancelable(true)
                .setPositiveButton("XÁC NHẬN",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                if (person == null) {
                                    create(edtName.getText().toString(), edtEmail.getText().toString());
                                } else {
                                    update(position, person.getId(), edtName.getText().toString(), edtEmail.getText().toString());
                                }
                            }
                        })
                .setNegativeButton("HỦY BỎ",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.setCancelable(false);
        alertDialog.setCanceledOnTouchOutside(false);
        alertDialog.show();
    }

    private void showDeleteDialog(final Person person, final int position) {
        LayoutInflater li = LayoutInflater.from(getApplicationContext());
        View promptsView = li.inflate(R.layout.dialog_delete, null);
        final TextView tvName = promptsView.findViewById(R.id.tvName);
        tvName.setText("Bạn muốn xóa thông tin người dùng [" + person.getName().toUpperCase() + "] không?");
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setView(promptsView);
        alertDialogBuilder
                .setCancelable(true)
                .setPositiveButton("XÁC NHẬN",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                delete(position, person.getId());
                            }
                        })
                .setNegativeButton("HỦY BỎ",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.setCancelable(false);
        alertDialog.setCanceledOnTouchOutside(false);
        alertDialog.show();
    }

}

Trong gói listener tạo hai lớp lần lượt RecyclerTouchListener.javaMyDividerItemDecoration.java

Lớp RecyclerTouchListener.java:

package com.teamvietdev.android.sqlitedatabase.listener;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private ClickListener clicklistener;
    private GestureDetector gestureDetector;

    public RecyclerTouchListener(Context context, final RecyclerView recycleView, final ClickListener clicklistener) {

        this.clicklistener = clicklistener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                 return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recycleView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clicklistener != null) {
                    clicklistener.onLongClick(child, recycleView.getChildAdapterPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clicklistener != null && gestureDetector.onTouchEvent(e)) {
            clicklistener.onClick(child, rv.getChildAdapterPosition(child));
        }

        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }

    public interface ClickListener {
        void onClick(View view, int position);

        void onLongClick(View view, int position);
    }
    
}

Lớp MyDividerItemDecoration.java:

package com.teamvietdev.android.sqlitedatabase.listener;

import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.TypedValue;
import android.view.View;

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{
            android.R.attr.listDivider
    };

    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

    private Drawable mDivider;
    private int mOrientation;
    private Context context;
    private int margin;

    public DividerItemDecoration(Context context, int orientation, int margin) {
        this.context = context;
        this.margin = margin;
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
        setOrientation(orientation);
    }

    public void setOrientation(int orientation) {
        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
            throw new IllegalArgumentException("invalid orientation");
        }
        mOrientation = orientation;
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (mOrientation == VERTICAL_LIST) {
            drawVertical(c, parent);
        } else {
            drawHorizontal(c, parent);
        }
    }

    public void drawVertical(Canvas c, RecyclerView parent) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();

        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left + dpToPx(margin), top, right - dpToPx(margin), bottom);
            mDivider.draw(c);
        }
    }

    public void drawHorizontal(Canvas c, RecyclerView parent) {
        final int top = parent.getPaddingTop();
        final int bottom = parent.getHeight() - parent.getPaddingBottom();

        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int left = child.getRight() + params.rightMargin;
            final int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top + dpToPx(margin), right, bottom - dpToPx(margin));
            mDivider.draw(c);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        if (mOrientation == VERTICAL_LIST) {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    }

    private int dpToPx(int dp) {
        Resources r = context.getResources();
        return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()));
    }

}

Cuối cùng khi đã hoàn thành xong các bước trên bạn hãy tiến hành chạy thử chương trình ví dụ sử dụng SQLite trong Android, còn đây là kết quả mà mình thực hiện:

Lời kết: Như vậy trong ứng dụng Android để thực hiện việc lưu trữ và truy xuất dữ liệu bạn có thể sử dụng SQLite trong Android. Ngoài ra bạn có thể xem thêm nhiều bài viết khác trong chủ đề lập trình Android tại Team Việt Dev.

(Tác giả: Team Việt Dev)

Bình luận