Hướng dẫn dùng SQLite tạo Database lưu trữ trong Android

Ở bài hôm trước chúng ta đã tạo một ứng dụng hiện thị danh sách các sản phẩm lên ListView và biết thêm các thao tác thêm, xóa, sửa trên ListView.
Hôm nay chúng ta tiếp tục sử dụng lại Project đó, nhưng các sản phẩm chúng ta sẽ được lưu ở dạng Database sử dụng SQLite.(Nhấn vào tên class để xem toàn bộ source class đó)
1. Ta thêm thuộc tính private long ProductIDvào trong class Product
2. Tạo thêm package com.androidtmc.sales.repository. Ta tạo thêm 2 class để xử lý Database SQLite
 - DatabaseHelper
ProductRepository

package com.androidtmc.sales.repository; 
 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
 
public class DatabaseHelper extends SQLiteOpenHelper { 
    static final String DB_NAME = "Sales"; 
    public DatabaseHelper(Context context) { 
        super(context, DB_NAME, null, 1); // 1: version 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
        String sql = ProductRepository.getCreateTableSQL(); 
        db.execSQL(sql); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 
} 

Gii thích:
Class SQLiteOpenHelper giúp chúng ta định nghĩa tên database (phi truyn tên database cho constructor)
SQLiteOpenHelper cung cp hàm o onCreate để thc hin các lnh to bng lđầu tiên và hàm o onUpgrade để thi hành các lnh bsung, chnh sa bng nếuchúng ta cn thay đổi. Điu này được thc hin thông qua biến version:
• Ln đầu chy vi version là 1, SQLite gi hàm onCreate để thi hành cáclnh to bng ban đầu. Database được ghi nhn là version 1.
Nếu version được sa li là 2, SQLite gi hàm onUpgrade vi oldVersion = 1 và newVersion = 2. Lúc đó ta có ththi hành lnh chnh sa bng hoc bsung bng mi. Database được ghi nhn là version 2.
Nếu version được sa tiếp là 3, SQLite gi hàm onUpgrade voldVersion = 2 và newVersion = 3. Lúc đó ta có ththi hành lnh chnh sa tiếp. Sau đó database được ghi nhn là version 3.
Nếu các ln chy tiếp theo version không được sa thì SQLiteOpenHelper skhông gi làm onCreate cũng như onUpgrade. Cutrúc database vn ginguyên.



Bây gi, để thc hin các thao tác thêm, xóa, sa, truy xut dliu trên bng Product, to class ProductRepository cũng trong package com.androidtmc.repository:
package com.androidtmc.sales.repository; 
 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
 
import com.androidtmc.sales.models.Product; 
 
import java.util.ArrayList; 
 
/** 
 * Created by minhc_000 on 13/08/2015. 
 */ 
public class ProductRepository { 
    static final String TAB_PRODUCT = "Product"; 
    static final String COL_PRODUCTID = "ProductID"; 
    static final String COL_PRODUCTNAME = "ProductName"; 
    static final String COL_UNIT = "Unit"; 
    static final String COL_PRICE ="Price"; 
 
    public static String getCreateTableSQL() 
    { 
        String sql = "CREATE TABLE " + TAB_PRODUCT + "(" + 
                COL_PRODUCTID + " integer primary key autoincrement, " + 
                COL_PRODUCTNAME + " text, " + 
                COL_UNIT + " text, " + 
                COL_PRICE + " real)"; 
        return sql; 
    } 
    private DatabaseHelper dbhelper; 
    public ProductRepository(Context context) { 
        dbhelper = new DatabaseHelper(context); 
    } 
    private ContentValues MakeProductContentValues(Product p) 
    { 
        ContentValues cv = new ContentValues(); 
        cv.put(COL_PRODUCTNAME, p.getProductName()); 
        cv.put(COL_UNIT, p.getUnit()); 
        cv.put(COL_PRICE, p.getPrice()); 
        return cv; 
    } 
    public void insertProduct(Product p) 
    { 
        ContentValues cv = MakeProductContentValues(p); 
        SQLiteDatabase db = dbhelper.getWritableDatabase(); 
        long id = db.insert(TAB_PRODUCT, null, cv); 
        if (id!= -1) p.setProductID(id); 
    } 
    public void updateProduct(Product p) 
    { 
        ContentValues cv = MakeProductContentValues(p); 
        SQLiteDatabase db = dbhelper.getWritableDatabase(); 
        db.update(TAB_PRODUCT, cv, COL_PRODUCTID + "=?", 
                new String[] { String.valueOf(p.getProductID()) }); 
    }public void deleteProduct(long id) 
    { 
        SQLiteDatabase db = dbhelper.getWritableDatabase(); 
        db.delete(TAB_PRODUCT,COL_PRODUCTID + " = " + id,null); 
    } 
    public ArrayList<Product> getAllProduct() 
    { 
        ArrayList<Product> products = new ArrayList<Product>(); 
        SQLiteDatabase db = dbhelper.getReadableDatabase(); 
        String sql = "SELECT * FROM " + TAB_PRODUCT; 
        Cursor cursor = db.rawQuery(sql, null); 
        int indexProductID = cursor.getColumnIndex(COL_PRODUCTID); 
        int indexProductName = cursor.getColumnIndex(COL_PRODUCTNAME); 
        int indexUnit = cursor.getColumnIndex(COL_UNIT); 
        int indexPrice = cursor.getColumnIndex(COL_PRICE); 
        if (cursor.moveToFirst()) { 
            while (!cursor.isAfterLast()) { 
                Product p = new Product(); 
                p.setProductID(cursor.getLong(indexProductID)); 
                p.setProductName(cursor.getString(indexProductName)); 
                p.setUnit(cursor.getString(indexUnit)); 
                p.setPrice(cursor.getDouble(indexPrice)); 
                products.add(p); 
                cursor.moveToNext(); 
            } 
        } 
        cursor.close(); 
        return products; 
    } 
} 

Gii thích:
Các hng sTAB_PRODUCT, COL_PRODUCTID, COL_PRODUCTNAME,
COL_UNIT, COL_PRICE xác định tên bng và tên các thuc tính.
Hàm getCreateTableSQL(): to câu lnh to bng dùng cho DatabaseHelper. Câu lnh
to bng này có giá trnhư sau:
CREATE Product (
ProductID integer primary key autoincrement,
ProductName text,
Unit text,
Price real)
primary key nhm xác định khóa chính, autoincrement nhm xác định ProductID là biến tự động tăng khi thêm record vào cơ sdliu.
Khi thêm hay sa record, Android yêu cu cung cp giá trca các ct thông qua biếContentValues. Ta sdng hàm MakeProductContentValues để chuyn giá trtừ đối
tượng Product sang ContentValues.
Hàm insertProduct: thêm sn phm vào database. Ta gi hàm insert cSQLiteDatabase. Hàm insert này cũng trvgiá trca ct ProductID (ttăng), ta cp
nht ngược li vào đối tượng Product.
Hàm updateProduct: sa thông tin mt sn phm. Ta gi hàm update cSQLiteDatabase, sdng ProductID ca sn phm để xác định sn phm nào cupdate.
Hàm getAllProduct: Truy xut tt ccác sn phm có trong database và chuyn thành ArrayList. Ta dùng hàm rawQuery để thc hin mnh đề SELECT và dùng
cursor để truy xut kết qu. Cursor có các phương thc moveToFirst(), moveToNext() và IsAfterLast()


Cui cùng để sdng ProductRepository để truy xut cơ sdliu, ta sa hàm OnCreate trong  MainActivity li như sau:
lv = (ListView) findViewById(R.id.lvProducts); 
        //Khởi tạo các sản phẩm 
        //lấy sản phẩm từ database 
        repo = new ProductRepository(this); 
        if(repo.getAllProduct().size()>0)//nếu đã có 
        //lưu lấy ra mảng 
            SaleManager.get().setProducts(repo.getAllProduct()); 
        else{//nếu chưa có trong database 
            //dùng hàm tạo sẳn để test 
            saleManager.generateProducts(); 
        } 
 
        adapter = new ProductAdapter(this,SaleManager.get().getProducts());//khởi tạo adapter 
        lv.setAdapter(adapter);//hiển lên listview

Ta sửa lại class OKClickListener trong class ProductActivity để lưu sản phẩm mới vào Database khi click OK
class OKClickListener implements View.OnClickListener 
    { 
        @Override 
        public void onClick(View v) { 
            //lấy dữ liệu từ layout để cập nhật lại các sản phẩm trong mảng 
            product.setProductName(txtProductName.getText().toString()); 
            product.setUnit(txtUnit.getText().toString()); 
            String s = txtPrice.getText().toString(); 
            s = s.replace(",", ""); 
            double price = Double.parseDouble(s); 
            product.setPrice(price); 
            //nếu position = -1 ta thực hiện chứ năng thêm sp mới vào mảng 
            if (position == -1){ 
                SaleManager saleManager = new SaleManager(); 
                SaleManager.get().getProducts().add(product); 
                ProductRepository repo = new ProductRepository(ProductActivity.this); 
                repo.insertProduct(product);// lưu vào database 
            } 
 
            Intent returnIntent = new Intent(); 
            setResult(Activity.RESULT_OK, returnIntent); 
            finish(); 
        } 
    }

Để xóa sản phẩm trong Database ta sửa lại class OnItemClickRemve trong MainActivity

 
 
    private class ItemLongClickRemove implements AdapterView.OnItemLongClickListener { 
        @Override 
        public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this); 
            alertDialogBuilder.setMessage("Bán có muốn xóa sản phẩm này!"); 
            alertDialogBuilder.setPositiveButton("Có", new DialogInterface.OnClickListener() { 
                @Override 
                public void onClick(DialogInterface dialog, int which) { 
                    // xóa sp đang nhấn giữ 
 
                    Product pro = (Product)SaleManager.get().getProducts().get(position); 
                    //xóa sản phẩm đang chọn trong Database 
                    repo.deleteProduct(pro.getProductID()); 
                    SaleManager.get().getProducts().remove(position); 
                    //cập nhật lại listview 
                    adapter.notifyDataSetChanged(); 
 
                } 
            }); 
            alertDialogBuilder.setNegativeButton("Không", new DialogInterface.OnClickListener() { 
                @Override 
                public void onClick(DialogInterface dialog, int which) { 
                    //không làm gì 
                } 
            }); 
            alertDialogBuilder.show(); 
            return true; 
        } 
    }


Bây giờ chúng ta có thể chạy ứng dụng và kiểm tra
SHARE

GivesTech

  • Image
  • Image
  • Image
  • Image
  • Image
    Blogger Comment
    Facebook Comment

5 nhận xét:

  1. a up code lên được không ạ? tại em thấy có một số chỗ bị lỗi và thiếu a

    Trả lờiXóa
  2. Cho mình hỏi với ạ? Làm sao có thể copy dữ liệu từ layout cũ sang 1 layout mới chỉ khác hình nhưng nội dung hay button thì vẫn y nguyên vậy ạ

    Trả lờiXóa