Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

SQLite Database trong Android

Discussion in 'Hướng dẫn lập trình Android' started by kim, 14/10/12.

  1. kim

    kim Thành viên VIP Staff Member

    [​IMG]

    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)

    [​IMG]

    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.

    [​IMG]
    [​IMG]
    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, ....)
    [​IMG]
    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:

    [​IMG]
    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!
    [​IMG]
    Ở đây mình chỉ quan tâm đến 3 param thôi!
    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.
    [​IMG]
    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
    [​IMG]

    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
    [​IMG]
    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
    [​IMG]
    Xóa dữ liệu thông qua phương thức delete(...)

    Phương thức sửa
    [​IMG]
    Chi tiết phương thức update(...)
     
  2. kim

    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
    [​IMG]
    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
    [​IMG]
    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 idString nameint point) {
            
    this.id id;
            
    this.name name;
            
    this.point point;
        }

        public 
    User(String nameint 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(contextDATABASE_NAMEnull1);
        }

        @
    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 dbint 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_KEYuser.getName());
            
    mValue.put(POINT_KEYuser.getPoint());

            
    //Insert vào table
            
    mdb.insert(TABLE_NAMEnullmValue);
            
    //Đó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_NAMEID_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_KEYuser.getName());
            
    mValue.put(POINT_KEYuser.getPoint());

            
    mdb.update(TABLE_NAMEmValueID_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_KEYNAME_KEYPOINT_KEY},
                    
    ID_KEY+"=?",
                    new 
    String[]{String.valueOf(id)}, nullnullnull);

            
    //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<UsergetAllPlayer(){
            
    SQLiteDatabase mdb getReadableDatabase();
            
    String sql "select * from " TABLE_NAME;
            
    Cursor mCursor mdb.rawQuery(sqlnull);
            
    ArrayList<UserarrPlayer = 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<UsermArr mHandler.getAllPlayer();
            
    Log.i(TT"Danh sách Player");
            for (
    User user mArr) {
                
    Log.i(TTuser.getId() + ":"+user.getName() + ":" +user.getPoint());
            }
        }

        @
    Override
        
    public boolean onCreateOptionsMenu(Menu menu) {
            
    getMenuInflater().inflate(R.menu.activity_sqlitemenu);
            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ả:
    [​IMG]

    >> Source Code Project <<
    Chúc mọi người thành công! :)
     
    lbhk001111 and quangbeo216 like this.
  3. lbhk001111

    lbhk001111 New Member

    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!
     

Chia sẻ trang này

Loading...