SQLite là một loại cơ sở dữ liệu trên mobile. Có nhiều cách để lưu trữ dữ liệu trong android như ghi dữ liệu dưới dạng text file, xml hay SharePreference và SQLite. Do SQLite là file được lưu với cấu trúc “data base” nên việc truy xuất và lưu dữ dữ liệu (thêm, sửa, xóa, lấy dữ liệu) khá dễ dàng. Nếu các bạn đã quen làm việc trên các hệ quản trị CSDL khác như: MySQL, SQL server… thì có thể dễ dàng hiểu được cách thức làm việc trên SQLite
Để làm việc với SQLite các bạn cần làm theo cài đặt theo các bước sau:
. Vào thư mục tools trong thư mục sdk trên máy của bạn. Trên máy mình có link như trên hình
. Tạo biến môi trường: tương tự như tạo biến môi trường khi cài jdk
Chuột phải My computer -> properties -> Advanced system settings ->Environtnent Variables -> chọn value name PATH -> edit
Variable name: PATH
Variable valute: các bạn add thêm vào sao các link có sẵn “F:\android\adt-bundle-windows-x86_64-20131030\sdk\tools” (đường dẫn đến thư mục tools trong foder sdk trong máy của bạn)
Note: các bạn dùng dấu “;” để ngăn cách các phần trong variable value
. Để kiểm tra các bạn có thể bật cmd gõ lệnh sqlite3 thấy kết quả như trên hình là được
Tương tự với các hệ quản trị CSDL khác SQLite cũng có 1 tools hỗ trợ cho việc quản lý đó là SQLiteAdmin
Các bạn có thể download SQLiteAdmin theo link
http://sqliteadmin.orbmu2k.de/
Hoặc download luôn bộ cài của mình ở link dưới
sqliteadmin
Sau khi download về và giải nén các bạn chạy file sqliteadmin.exe thấy xuất hiện giao diện
Cũng giống như các tools quản trị CSDL khác tools này giúp bạn làm việc với CSDL bạn tạo( Mình hay dùng tools này để kiểm tra các câu truy vấn xem có đúng không mình sẽ hướng dẫn cách mình hay làm ở dưới)
Để các bạn hiểu rõ về SQLite trong bài này mình sẽ làm 1 ví dụ đơn giản về việc tạo một bảng dữ liệu SinhVien với 3 cột là _id, Name và Address sau đó mình sẽ viết các hàm để thực hiện INSERT, UPDATE , DELETE, SELECT với bảng đấy. Trong bài tiếp theo mình sẽ hướng dẫn các bạn làm ví dụ với nhiều bảng trong SQLite.
Để làm ví dụ này các bạn các bạn cần thực hiện theo lần lượt các bước sau:
Bước 1: mở file activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"</pre>
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Bước 2: tạo file layout_tiem.xml (mình muốn hiển thị dữ liệu select lên được ra listview với mỗi item có giao diện như file này)
<?xml version="1.0" encoding="utf-8"?></pre>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingBottom="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/tvName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:id="@+id/tvAddress"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
Bước 3: mình tạo class Student.java trong packet com.example.sqlitedemo2
package com.example.sqlitedemo2;</pre>
public class Student {
public String Name;
public String Address;
public Student() {
super();
}
public Student(String name, String address) {
super();
Name = name;
Address = address;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getAddress() {
return Address;
}
public void setAddress(String address) {
Address = address;
}
}
Bước 4: tạo file MySQLiteOpenHelper.java – class này quản lý việc chúng ta truy xuất xuống CSDL
package com.example.sqlitedemo2;</pre>
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "MyDataBase.db";
private static final int vs = 1;
private SQLiteDatabase database;
// init table
// init table SinhVien
public static final String TB_NAME = "SinhVien";
// init ten cac cot trong table
public static final String CL_id = "_id";
public static final String CL_Name = "Name";
public static final String CL_Address = "Address";
// ....
public MySQLiteOpenHelper(Context context) {
super(context, DB_NAME, null, vs);
database = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sqlCreatSinhVien = "CREATE TABLE " + TB_NAME + "(" + CL_id
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + CL_Name + " TEXT, "
+ CL_Address + " TEXT)";
// cac ban nen log cac cau sql ra va chay thu tren sqliteadmin de phat hien ra loi
Log.d("debug", sqlCreatSinhVien);
db.execSQL(sqlCreatSinhVien);
// neu csdl cp nhieu bang thi cac bang khac o day
// ...
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS " + TB_NAME);
onCreate(db);
}
// cac phuong thuc de lam viec voi bang TB_NAME
// insert vao bang TB_NAME = "SinhVien"
public void INSERT_SinhVien(Student mStudent) {
ContentValues values = new ContentValues();
values.put(CL_Name, mStudent.getName());
values.put(CL_Address, mStudent.getAddress());
database.insertOrThrow(TB_NAME, null, values);
}
// delete 1 dong trong bang TB_NAME = "SinhVien" voi gia tri cot id = id
public void DELETE_SinhVien(int id) {
database.delete(TB_NAME, CL_id + " = " + id, null);
}
// update 1 dong trong bang TB_NAME = "SinhVien" voi gia tri cot id = id
public void UPDATE_SinhVien(Student mStudent, int id) {
ContentValues values = new ContentValues();
values.put(CL_Name, mStudent.getName());
values.put(CL_Address, mStudent.getAddress());
database.update(TB_NAME, values, "_id = " + id, null);
}
// select toan bo bang TB_NAME = "SinhVien"
public Cursor SELECT_ALL__SinhVien() {
return database.query(TB_NAME, null, null, null, null, null, null);
}
// neu DB cua cac ban co nhieu bang cac ban co the viet them cac
// phuong thuc update,insert,delete,select cho cac bang nay tiep o ben duoi
//.....
// minh viet phuong thuc chung dung de SELECT trong CSDL DB_NAME = "MyDataBase.db"
// khi truyen vao 1 cau select sql voi 1 bang bat ky trong DB thi ket qua tra ra la cursor
public Cursor SELECTSQL(String sql) {
return database.rawQuery(sql, null);
}
// phuong thuc nay de dong DB khi khong su dung
public void CloseBD() {
if (database != null && database.isOpen())
database.close();
}
}
Bước 5: mở file MainActivity.Java
package com.example.sqlitedemo2;</pre>
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ListActivity {
private static final String TAG = "MainActivity";
private MySQLiteOpenHelper dataHelper;
private Cursor cursor; // tuong duong voi mang
private SimpleCursorAdapter adapter; // tuong duong voi adapter
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// khoi tao mot doi tuong MySQLiteOpenHelper
dataHelper = new MySQLiteOpenHelper(MainActivity.this);
// insert Data vao Local DB
LoadData();
// get DL de hien thi len listview
// neu ban muon get toan bo bang TB_NAME = "SinhVien" thi gan
//cursor = dataHelper.SELECT_ALL__SinhVien();
// trong vi du nay minh muon truyen vao 1 cau sql de select ra 1 bang gia tri
String sql = "select * from " + MySQLiteOpenHelper.TB_NAME + " where "
+ MySQLiteOpenHelper.CL_id + " >7 and "
+ MySQLiteOpenHelper.CL_id + " <15";
Log.d(TAG, sql);
cursor = dataHelper.SELECTSQL(sql);
// chung ta co the lay gia tri ung voi tung dong trong bang ket qua tra ra
// Doan code duoi day huong dan cac ban cach lay tung dong du lieu
// quet toan bo bang ket qua tra ve
while (cursor.moveToNext()) {
// lay gia tri cua cot id ung voi dong dang xet
String id = cursor.getString(cursor
.getColumnIndex(MySQLiteOpenHelper.CL_id));
if (Integer.parseInt(id) % 2 == 0) {
// neu cot dang xet co id la chan
// lay name va adress
String name = cursor.getString(cursor
.getColumnIndex(MySQLiteOpenHelper.CL_Name));
String Address = cursor.getString(cursor
.getColumnIndex(MySQLiteOpenHelper.CL_Address));
// tam thoi minh chi log du lieu ra cac ban co the xu ly du lieu nay 1 cac tuy y
Log.d(TAG, "id: " + id + " name: " + name + " add: " + Address);
}
}
// cac ban nho dong DB khi khong can su dung nua
dataHelper.CloseBD();
// co the show toan bo cusor thong qua listview
// khoi tao adater
String[] from = { MySQLiteOpenHelper.CL_Name,
MySQLiteOpenHelper.CL_Address };
int[] to = { R.id.tvName, R.id.tvAddress };
adapter = new SimpleCursorAdapter(MainActivity.this,
R.layout.layout_item, cursor, from, to);
// setadapter cho listview
setListAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void LoadData() {
// trong vi du nay minh tam thoi ghi 1 so du lieu xuong DB de co ket qua hien thi
Student mStudent = new Student();
mStudent.setName("Loc");
mStudent.setAddress("TPHCM Viet Nam");
dataHelper.INSERT_SinhVien(mStudent);
Student mStudent1 = new Student("Truong1", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent1);
Student mStudent2 = new Student("Truong2", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent2);
Student mStudent3 = new Student("Truong3", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent3);
Student mStudent4 = new Student("Truong4", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent4);
Student mStudent5 = new Student("Truong5", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent5);
Student mStudent6 = new Student("Truong6", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent6);
Student mStudent7 = new Student("Truong7", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent7);
Student mStudent8 = new Student("Truong8", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent8);
Student mStudent9 = new Student("Truong9", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent9);
Student mStudent10 = new Student("Truong10", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent10);
Student mStudent11 = new Student("Truong11", "Ha Noi Viet Nam");
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
dataHelper.INSERT_SinhVien(mStudent11);
}
}
Note: Cách kiểm tra các câu truy vấn dùng SQLiteadmind
Trên thực tế việc viết sai các câu SQL là rất phổ biến vì thế mình khuyến khích các bạn nên đặt log mỗi khi viết 1 câu SQL nào đó sau đó để kiểm tra lại câu SQL đã đúng chưa các bạn có thể copy vào tools sqliteadmind để kiểm tra lỗi bằng cách
Copy DB các bạn tạo ra về PC và mở bằng SQLite
Để copy DB các bạn vào DDMS-> File Explorer -> data -> data -><packet-name-your-project>
Như hình dưới
(nếu trên tools bar của các bạn không có DDMS các bạn có thể mở bằng cách chọn Window->Open Perspective->Other -> DDMS)
Sau đó lấy file*.db của bạn ra máy tính theo hình
Dùng tools SQLiteAdmin mở file db các bạn vừa lấy về
Sau đó các bạn có thể thử mọi câu sql với DB đó để xem nó đúng hay sai
Note:Các bạn có thể theo dõi kết quả thực hiện chương trình trên logcat và màn hình. Khi làm theo ví dụ các bạn có gì không hiểu có thể để lại câu hỏi trên web mình sẽ trả lời các bạn một cách nhanh nhất có thể. Các bạn có thể down full src theo link dưới đây
SQLiteDemo2
Kết quả thực hiện chương trình