Lưu Trữ Dữ Liệu Với SQLite (Thực Hành) | How Kteam

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau TÌM HIỂU VỀ SQLITE, con trỏ và các lớp Java làm việc với SQLite trong Android. Tuy nhiên tất cả mới chỉ là lý thuyết.

Trong bài học này, chúng ta sẽ thực hành làm một ứng dụng lưu tên và xóa tên đơn giản.

Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

  • CẤU TRÚC CƠ BẢN CỦA MỘT CHƯƠNG TRÌNH ANDROID.
  • Đã đọc bài trước, hay ít nhất là biết SQLITE LÀ GÌ?.
  • Sẵn sàng để thực hành code.

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Viết một ứng dụng sử dụng SQLite.
  • Truy cập vào database bằng ứng dụng bên thứ 3.

Viết ứng dụng cơ bản sử dụng SQLite

Trong phần này chúng ta cùng điểm qua về DAO(Data Access Object). DAO có nhiệm vụ xử lý kết nối với Database để truy cập và chỉnh sửa dữ liệu. DAO cũng có nhiệm vụ chuyển đổi từ đối tượng trong database thành đối tượng Java tương ứng.

Tuy nhiên sử dụng DAO không phải lúc nào cũng hợp lý. Đôi khi dùng trực tiếp thẳng vào database, hoặc sử dụng Content Provider thì tốt hơn (vì đỡ phải tạo model).

Bước 1: Tạo project với các thông tin như hình vẽ (tên là SQLiteEx):

Lưu trữ dữ liệu với SQLite (Thực hành)

  • Và chọn mức API13:

Lưu trữ dữ liệu với SQLite (Thực hành)

Bước 2: Tạo lớp HowkSQLiteHelperkế thừa từ SQLiteOpenHelper:

  • HowkSQLiteHelper.java
package com.howkteam.sqliteex; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class HowkSQLiteHelper extends SQLiteOpenHelper {   public static final String TABLE_PEOPLE = "people";   public static final String COLUMN_ID = "_id";   public static final String COLUMN_PERSON = "person";   private static final String DATABASE_NAME = "people.db";   private static final int DATABASE_VERSION = 1;   // Câu lệnh khởi tạo Database.   private static final String DATABASE_CREATE = "create table "           + TABLE_PEOPLE + "( " + COLUMN_ID           + " integer primary key autoincrement, " + COLUMN_PERSON           + " text not null);";   public HowkSQLiteHelper(Context context) {     super(context, DATABASE_NAME, null, DATABASE_VERSION);   }   @Override   public void onCreate(SQLiteDatabase database) {     database.execSQL(DATABASE_CREATE);   }   @Override   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {     Log.w(HowkSQLiteHelper.class.getName(),             "Upgrading database from version " + oldVersion + " to "                     + newVersion + ", which will destroy all old data");     db.execSQL("DROP TABLE IF EXISTS " + TABLE_PEOPLE);     onCreate(db);   } }

Lớp SQLiteOpenHelper này có tác dụng định nghĩa các câu truy vấn, cũng như làm nền móng cho việc giao tiếp với SQLite. Như các bạn đã thấy, chúng ta có truy vấn để tạo bảng: (DATABASE_CREATE), và tên các cột, bảng, file database.

  • Đồng thời tạo class Person.java
package com.howkteam.sqliteex; public class Person {   private long id;   private String name;   public long getId() {     return id;   }   public void setId(long id) {     this.id = id;   }   public String getName() {     return name;   }   public void setName(String comment) {     this.name = comment;   }   // Will be used by the ArrayAdapter in the ListView   @Override   public String toString() {     return name;   } }

Bước 3: Tạo lớp PeopleDataSource. Lớp này không kế thừa từ đâu cả, mà chỉ có nhiệm vụ xử lý dữ liệu từ Database nhờ sự trợ giúp của lớp Helper phía trên, và chứa các phương thức để lấy dữ liệu ra dạng Java object:

package com.howkteam.sqliteex; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import java.util.ArrayList; import java.util.List; public class PeopleDataSource {   // Các trường database.   private SQLiteDatabase database;   private HowkSQLiteHelper dbHelper;   private String[] allColumns = {HowkSQLiteHelper.COLUMN_ID,           HowkSQLiteHelper.COLUMN_PERSON};   public PeopleDataSource(Context context) {     dbHelper = new HowkSQLiteHelper(context);   }   public void open() throws SQLException {     database = dbHelper.getWritableDatabase();   }   public void close() {     dbHelper.close();   }   public Person createPerson(String pName) {     ContentValues values = new ContentValues();     values.put(HowkSQLiteHelper.COLUMN_PERSON, pName);     long insertId = database.insert(HowkSQLiteHelper.TABLE_PEOPLE, null,             values);     Cursor cursor = database.query(HowkSQLiteHelper.TABLE_PEOPLE,             allColumns, HowkSQLiteHelper.COLUMN_ID + " = " + insertId, null,             null, null, null);     cursor.moveToFirst();     Person newPerson = cursorToPerson(cursor);     cursor.close();     return newPerson;   }   public void deletePerson(Person p) {     long id = p.getId();     Log.e("SQLite", "Person entry deleted with id: " + id);     database.delete(HowkSQLiteHelper.TABLE_PEOPLE, HowkSQLiteHelper.COLUMN_ID             + " = " + id, null);   }   public List<Person> getAllPeople() {     List<Person> people = new ArrayList<Person>();     Cursor cursor = database.query(HowkSQLiteHelper.TABLE_PEOPLE,             allColumns, null, null, null, null, null);     cursor.moveToFirst();     while (!cursor.isAfterLast()) {       Person person = cursorToPerson(cursor);       people.add(person);       cursor.moveToNext();     }     // Nhớ đóng con trỏ lại nhé.     cursor.close();     return people;   }   private Person cursorToPerson(Cursor cursor) {     Person person = new Person();     person.setId(cursor.getLong(0));     person.setName(cursor.getString(1));     return person;   } }

Bước 4: Quay lại sửa file activity_main.xml lại như sau:

<?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="match_parent"               android:orientation="vertical">     <LinearLayout         android:id="@+id/group"         android:layout_width="wrap_content"         android:layout_height="wrap_content">         <Button             android:id="@+id/add"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:onClick="onClick"             android:text="Add New"/>         <Button             android:id="@+id/delete"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:onClick="onClick"             android:text="Delete First"/>     </LinearLayout>     <ListView         android:id="@android:id/list"         android:layout_width="match_parent"         android:layout_height="wrap_content"         /> </LinearLayout>

Bước 5: Chỉnh sửa lại lớp MainActivity, kế thừa cho nó từ ListActivity và tiến hành đổ dữ liệu:

package com.howkteam.sqliteex; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import java.util.List; import java.util.Random; public class MainActivity extends ListActivity {   private PeopleDataSource datasource;   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     datasource = new PeopleDataSource(this);     datasource.open();     List<Person> values = datasource.getAllPeople();     // use the SimpleCursorAdapter to show the     // elements in a ListView     ArrayAdapter<Person> adapter = new ArrayAdapter<Person>(this,             android.R.layout.simple_list_item_1, values);     setListAdapter(adapter);   }   // Tạo sự kiện khi click vào các nút trong activity_main.xml   public void onClick(View view) {     @SuppressWarnings("unchecked")     ArrayAdapter<Person> adapter = (ArrayAdapter<Person>) getListAdapter();     Person person = null;     switch (view.getId()) {       // Thêm người vào danh sách.       case R.id.add:         String[] people = new String[]{"Alice", "Bob", "Mallory"};         int nextInt = new Random().nextInt(3);         person = datasource.createPerson(people[nextInt]);         adapter.add(person);         break;       // Xóa người đầu tiên khỏi danh sách.       case R.id.delete:         if (getListAdapter().getCount() > 0) {           person = (Person) getListAdapter().getItem(0);           datasource.deletePerson(person);           adapter.remove(person);         }         break;     }     adapter.notifyDataSetChanged();   }   @Override   protected void onResume() {     datasource.open();     super.onResume();   }   @Override   protected void onPause() {     datasource.close();     super.onPause();   } }

Ở đây mình xin giải thích một chút:

  • Chúng ta tạo một mảng gồm 3 phần tử: Alice, BobMallory. Mỗi khi nhấn nút Add thì sẽ thêm ngẫu nhiên một trong 3 phần tử này vào danh sách.
  • Khi nhấn Delete thì danh sách sẽ bỏ phần tử đầu tiên.
  • Sau khi tắt app, bật lại, ứng dụng vẫn sẽ load danh sách như bình thường. Đó là vì nó đã được lưu trong SQLite rồi.

Chạy app, và chúng ta có:

Lưu trữ dữ liệu với SQLite (Thực hành)

Bước 6: Bước này chỉ dành cho những máy đã root .Các bạn có thể sử dụng một app ngoài như SQLite Editor để vọc sâu vào trong app SQLiteEx, các bạn sẽ thấy có file db được tạo ra và các bảng tương ứng:

Lưu trữ dữ liệu với SQLite (Thực hành)

Kết luận

Qua bài này chúng ta đã nắm được Cách sử dụng SQLite, các viết lệnh truy vấn, và lấy dữ liệu từ trong database.

Bài sau chúng ta sẽ THỰC HÀNH SQLITE VỚI SUGARORM

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.

Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Lưu trữ dữ liệu với SQLite (Thực hành) dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!

Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

CỘNG ĐỒNG HỎI ĐÁP HOWKTEAM.COM GROUP THẢO LUẬN FACEBOOK

Từ khóa » Cách Sử Dụng Sqlite