SQLite Database trong Android

kim

Thành viên VIP
Staff member


Chào mọi người, hôm nay chúng ta sẽ bàn về cách sử dụng SQLite trong Android, nó là gì vậy?
SQLite DataBase là cơ sở dữ liệu cho phép chúng ta lưu những thông tin của người dùng cũng như ứng dụng, và thực sự nó rất nhẹ và dễ sử dụng. Và tất nhiên còn nhiều cách khác nữa? (Nghe người ta nói thế chưa có thời gian chứng thực)

Để phục vụ cho một số mục đích sau này của tôi, chúng ta sẽ sử dụng dạng cấu trúc table như bên dưới: (Cho phép người dùng lưu tên và điểm của mình)



Với _idprimary key kiểu INT, tránh tình trạng lặp dữ liệu điều này ai cũng biết rồi!

Thực hiện
Bước 1: Tạo một Project mới.
Bước 2: Tạo một Class User trong Project vừa tạo.



Bước 3: Tạo một lớp cho phép chúng ta thao tác với Sqlite Database trên ứng dụng. Lớp này sẽ Handle mọi thao tác từ việc tạo Databse từ lúc sơ khai, đến lúc hình thành (cho phép chúng ta cập nhật cơ sở dữ liệu trong Databse như thêm, xóa, sửa, ....)

Android cung cấp cho chúng ta một lớp cho phép Handle với Sqlite Databse. Đó là SQLiteOpenHelper vì thế chúng ta chỉ cần kế thừa lại lớp này là gần như chúng ta có thể tùy ý điều khiển Sqlite Database rồi :cool:. Công việc bây giờ là là mình tạo một lớp cho phép handle như hình minh họa phía trên và chắc chắn là phải kế thừa từ SQLiteOpenHelper rồi!
Mình tạo Class HandleWithDataBase.java cho phép handle như đã nói ở phía trên:


Khi kế thừa SQLiteOpenHelper nó sẽ implement cho mình 3 phương thức bắt buộc đó là contructor với 4 param (mình có thể tùy chỉnh), onCreate(), onUpgrade().
Như hình trên mình chỉnh sửa trực tiếp trong phương thức super() luôn vậy nên mình sẽ viết contructor gọn lại một xíu tí gọi cho nó tiện!

Ở đây mình chỉ quan tâm đến 3 param thôi!
(context) Nhận vào ngữ cảnh mà nó làm việc.
(DATABASE_NAME) Tên database.
(1) Đây chính là version mà chúng ta quy định.
Mình thêm nội dung cho phương thức onUpgrade(). Với mục đích tạo mới Databse nếu chỉ số version thay đổi.

Quay lại phương thức onCreate(), mình sử dụng các thông số và kết hợp với SQL Query để tạo table Players


Bước 4: Bổ sung các phương thức thêm, xóa, sửa, lấy thông tin,... trên SQLite Database.

Phướng thức thêm

Mình sử dụng getWritableDatabase() để mở database nhằm chỉnh sửa dữ liệu, và một đối tượng ContentValues dùng để giữ các giá trị, và may mắn thay database của chúng ta có khả năng nhận một giá trị kiểu ContentValues thông qua phương thức insert(...). Và cuối cùng là đóng tài nguyên thông qua phương thức Close(). Điều này rất quan trong khi làm việc với database, nó hạn chế phần nào khả năng hao phí tài nguyên, và thất thoát dữ liệu,...

Phương thức xóa

Xóa dữ liệu thông qua phương thức delete(...)

Phương thức sửa

Chi tiết phương thức update(...)
 

kim

Thành viên VIP
Staff member
Mình bổ sung thêm 2 phương thức nữa, sẽ dùng cho mục đích sau này đó là:
Phương thức lấy thông tin một Player

Giải thích: Khi muốn lấy thông tin của trong database thông qua câu truy vấn sql chúng ta sư dụng Cursor interface. Và nó sẽ trả về cho Cursor một dòng kết quả thông qua phương thức rawQuery(...). Và nhớ đóng Cursor khi thực hiện xong nhé! (cả database nữa)

Phương thức lấy toàn bộ danh sách Player

Mình cho nó trả về một ArrayList chứa toàn bộ Player. Oop! Hình như cũng khá ổn rồi thì phải.
Code Class User.java
PHP:
package com.example.sqlitebasic;

public class User {
    //----------- Thuộc tính ------------
    private int id;
    private String name;
    private int point;

    //----------- Phương thức các thuộc tính-------
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPoint() {
        return point;
    }
    public void setPoint(int point) {
        this.point = point;
    }

    //--------- Contructor ---------------
    public User(int id, String name, int point) {
        this.id = id;
        this.name = name;
        this.point = point;
    }

    public User(String name, int point) {
        this.name = name;
        this.point = point;
    }

}
Code Class HandlerWithDatabase.java
PHP:
package com.example.sqlitebasic;

import java.util.ArrayList;

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

public class HandleWithDatabase extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "myDatabase";
    private static final String TABLE_NAME = "Players";
    private static final String ID_KEY = "_id";
    private static final String NAME_KEY = "_name";
    private static final String POINT_KEY = "_point";

    //Contructor
    public HandleWithDatabase(Context context){
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // Khởi tạo database từ lúc sơ khai
        String sqlCreateTable = "create table "+ TABLE_NAME + "("
                + ID_KEY + " integer primary key,"+ NAME_KEY +" text,"
                + POINT_KEY + " text" + ")";
        db.execSQL(sqlCreateTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion,
            int newVersion) {
        // Kiểm tra version, nếu không giống thì drop table
        db.execSQL("drop table if exists " + TABLE_NAME);

        // Create tables again
        onCreate(db);
    }

    //Thêm một dòng dữ liệu mới vào table Players
    public void addPlayer(User user){
        SQLiteDatabase mdb = getWritableDatabase();

        ContentValues mValue = new ContentValues();
        mValue.put(NAME_KEY, user.getName());
        mValue.put(POINT_KEY, user.getPoint());

        //Insert vào table
        mdb.insert(TABLE_NAME, null, mValue);
        //Đóng kết nối
        mdb.close();
    }

    //Xóa một dòng dữ liệu, dựa vào id
    public void deletePlayer(User user){
        SQLiteDatabase mdb = getWritableDatabase();

        //Xóa
        mdb.delete(TABLE_NAME, ID_KEY + "=?",
                new String[]{String.valueOf(user.getId())});
        mdb.close();
    }

    //Cập nhật một Player
    public void updatePlayer(User user){
        SQLiteDatabase mdb = getWritableDatabase();

        ContentValues mValue = new ContentValues();
        mValue.put(NAME_KEY, user.getName());
        mValue.put(POINT_KEY, user.getPoint());

        mdb.update(TABLE_NAME, mValue, ID_KEY +"=?",
                new String[]{String.valueOf(user.getId())});
        mdb.close();
    }

    //Lây thông tin một Player
    public User getInfoPlayer(int id){
        SQLiteDatabase mdb = getReadableDatabase();

        Cursor mCursor = mdb.query(TABLE_NAME,
                new String[]{ID_KEY, NAME_KEY, POINT_KEY},
                ID_KEY+"=?",
                new String[]{String.valueOf(id)}, null, null, null);

        //Kiểm tra dữ liệu rỗng hay không
        if(mCursor!=null)
            mCursor.moveToFirst();

        User mPlayer = new User(
                Integer.parseInt(mCursor.getString(0)),
                mCursor.getString(1),
                Integer.parseInt(mCursor.getString(2)));

        mCursor.close();
        mdb.close();
        return mPlayer;
    }

    public ArrayList<User> getAllPlayer(){
        SQLiteDatabase mdb = getReadableDatabase();
        String sql = "select * from " + TABLE_NAME;
        Cursor mCursor = mdb.rawQuery(sql, null);
        ArrayList<User> arrPlayer = new ArrayList<User>();

        if(mCursor.moveToFirst()){
            do {
                //Add vào ArrayList
                arrPlayer.add(new User(
                        Integer.parseInt(mCursor.getString(0)),
                        mCursor.getString(1),
                        Integer.parseInt(mCursor.getString(2))));
            } while (mCursor.moveToNext());
        }

        mCursor.close();
        mdb.close();

        return arrPlayer;
    }

}
Bước 6: Chuyển sang Activity và chạy thử
code Class Activity:
PHP:
package com.example.sqlitebasic;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;

public class SQLiteActivity extends Activity {

    private static final String TT = "TT";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqlite);

        HandleWithDatabase mHandler = new HandleWithDatabase(this);

        //Add dữ liệu vào database
        mHandler.addPlayer(new User("Tèo", 600));
        mHandler.addPlayer(new User("Tủn", 500));
        mHandler.addPlayer(new User("Mẹt", 600));
        mHandler.addPlayer(new User("Bé", 500));

        //Lấy thông tin 1 Player
        User mUser = mHandler.getInfoPlayer(1);
        Log.i(TT, "Thông tin User[1]: " + " ID-" + mUser.getId()
                + ", Name-" + mUser.getName()
                + ", Point-"+ mUser.getPoint());

        //Xóa 1 Player
        mHandler.deletePlayer(mUser);

        //Update 1 player
        {
            mUser.setId(6);
            mUser.setName("Tí");
            mUser.setPoint(900);
        }
        mHandler.updatePlayer(mUser);
        //Danh sách Player
        ArrayList<User> mArr = mHandler.getAllPlayer();
        Log.i(TT, "Danh sách Player");
        for (User user : mArr) {
            Log.i(TT, user.getId() + ":"+user.getName() + ":" +user.getPoint());
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_sqlite, menu);
        return true;
    }
}
Trên mình có sử dụng LogCat, nếu bạn nào chưa hiểu có thể tham khảo Link này
Kết quả:


>> Source Code Project <<
Chúc mọi người thành công! :)
 

lbhk001111

New Member
22/8/15
1
0
0
23
bài này sao bị lỗi hình hết rồi thớt ơi! Thớt làm ơn post lại hình nha, em đang rất cần! tks!