TUT ANDROID 018: SQLite trong Android (PART 1)

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

1

. 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)

edit_pathedit_path2

 

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

3

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

4

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)

5_1

5_2

Sau đó lấy file*.db của bạn  ra máy tính theo hình

pull

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

checked_sql

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

kq1

kq2

Comments
  1. 5 năm ago
    • 5 năm ago
  2. 5 năm ago
    • 5 năm ago
  3. 5 năm ago
  4. 5 năm ago
    • 5 năm ago
      • 5 năm ago
        • 5 năm ago
  5. 5 năm ago
  6. 5 năm ago
    • 5 năm ago
  7. 5 năm ago
    • 5 năm ago
  8. 5 năm ago
  9. 5 năm ago
  10. 5 năm ago
  11. 5 năm ago
    • 5 năm ago
  12. 5 năm ago
  13. 4 năm ago

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *