Khóa học lập trình Android cơ bản

Serial tutorial hướng dẫn lập trình Android cơ bản

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

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

Đã đăng 2016-11-07 19:36:18 bởi Kteam
0 bình luận 12395 lượt xem
Lưu trữ dữ liệu với SQLite (Thực hành) 1 /5 stars (1 reviews)
 

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:

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

kteam

  • Và chọn mức API 13:

kteam

Bước 2: Tạo lớp HowkSQLiteHelper kế 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ó:

kteam

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:

kteam


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 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 like hoặc +1 Google để ủ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. 

 

Chia sẻ:
Thảo luận Hỏi và đáp Báo lỗi bài viết
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  

Chiến dịch

Kteam - Howkteam Free Education