Three layer in android

28 325 0
Three layer in android

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Hướng dẫn tạo một ứng dụng cơ bản. Sử dụng mô hình lập trình 3 lớp để tương tác với Sqlite trong lập trình Android. Tài liệu hướng dẫn cách tạo một cơ sở dữ liệu Sqlite, cách thêm cơ sở dữ liệu vào trong Project trong Eclipse. Ví dụ cơ bản với thêm, sửa, xóa.

Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY MỤC LỤC I Giới thiệu mô hình lớp 1.1 Understanding Three-Layer Model: 1.2 Các thành phần – Layer 1.3 Cách vận hành mô hình II Xây dựng ứng dụng 2.1 Xây dựng Cơ sở liệu: 2.2 Tạo sở liệu 2.3 Xây dựng ứng dụng, sử dụng theo mô hình lớp 2.4 Khai báo quyền cho ứng dụng 26 2.5 Giao diện ứng dụng 27 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY MÔ HÌNH LẬP TRÌNH LỚP - SQLITE TRÊN ANDROID  Mục đích tài liệu: - Tài liệu hướng dẫn bạn cách lập trình thao tác sở liệu Sqlite lập trình Android theo Mô hình lớp, giống lập trình lớp thao tác với sở liệu Sql Server CSharp I Giới thiệu mô hình lớp 1.1 Understanding Three-Layer Model: Để dễ quản lý thành phần hệ thống, không bị ảnh hưởng thay đổi, người ta hay nhóm thành phần có chức lại với phân chia trách nhiệm cho nhóm để công việc không bị chồng chéo ảnh hưởng lẫn Một mô hình lập trình Mô hình lớp (Three Layers) 1.2 Các thành phần – Layer Mô hình lớp cấu thành từ: Presentation Layers, Business Logic Layers, Data Access Layers Presentation Layers (Lớp 3) - Lớp làm nhiệm vụ giao tiếp với người dùng cuối để thu thập liệu hiển thị kết quả/dữ liệu thông qua thành phần giao diện người sử dụng Trong NET bạn dùng Windows Forms, ASP.NET hay Mobile Forms để thực lớp  Lưu ý: Lớp không nên sử dụng trực tiếp dịch vụ lớp Data Access mà nên sử dụng thông qua service lớp Business Logic bạn sử dụng trực tiếp vậy, bạn bỏ qua ràng buộc, logic nghiệp vụ mà ứng dụng cần phải có Business Logic Layer (Lớp 2) Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY - Đây layer xử lý liệu trước đưa lên hiển thị hình xử lý liệu trước chuyển xuống Data Access Layer để lưu liệu xuống sở liệu Đây nơi đê kiểm tra ràng buộc, yêu cầu nghiệp vụ, tính toán, xử lý yêu cầu lựa chọn kết trả cho Presentation Layers Data Access Layer (Lớp 1) - Lớp thực nghiệp vụ liên quan đến lưu trữ truy xuất liệu ứng dụng đọc, lưu, cập nhật sở liệu 1.3 Cách vận hành mô hình Đối với 3-Layer, yêu cầu xử lý qua layer hình - Đầu tiên User giao tiếp với Presentation Layers (GUI) (mục số 3) để gửi thông tin yêu cầu Tại layer này, thông tin kiểm tra, OK chúng chuyển xuống Business Logic Layer (BLL) (mục số 2) - Tại BLL, thông tin nhào nặn, tính toán theo yêu cầu gửi, không cần đến Database BLL gửi trả kết GUI, ngược lại đẩy liệu (thông tin xử lý) xuống Data Access Layer (DAL) (mục số 1) - DAL thao tác với Database trả kết cho BLL, BLL kiểm tra gửi lên GUI để hiển thị cho người dùng - Một gặp lỗi (các trường hợp không liệu) layer quăng lên layer cao bậc GUI quăng cho người dùng biết - Các liệu trung chuyển Layer thông qua đối tượng gọi Data Transfer Object (DTO), đơn giản Class đại diện cho đối tượng lưu trữ Database (mục số 4) Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY II Xây dựng ứng dụng 2.1 Xây dựng Cơ sở liệu: Các bạn tạo sở liệu ứng dụng hỗ trợ Lưu lại với định dạng sqlite Các bạn kết hợp ứng dụng với ứng dụng lại có ưu nhược điểm khác Ở này, sử dụng ứng dụng SQLite Administrator SQLite manager (Một tiện ích có sẵn Firefox) Sau cài đặt: Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY Kéo thả tiện ích vào công cụ hình: Khi chạy tiện ích hình: Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY 2.2 Tạo sở liệu mới, đặt tên MyDatabase để thực hành ví dụ - Bạn tạo bảng liệu đặt tên SinhVien Chọn phải chuột vào Tables => Create Table Đặt tên bảng SinhVien Chọn Add Field để thêm trường Trương Khoan_KMT_TNUT - Sau thêm trường, ta chọn Create: - Ta sau: THÁI NGUYÊN UNIVERSITY Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY - Việc thêm, sửa, xóa, lấy liệu ta thực ứng dụng 2.3 Xây dựng ứng dụng, sử dụng theo mô hình lớp - Tạo ứng dụng android application, cấu trúc sau: (Bạn copy file MyDatabase.sqlite vừa tạo vào thư mục Access Project) Trong đó: Packet com.kmt.Example: thuộc lớp thứ lớp Giao diện Dùng để tương tác liệu với người dùng (hiển thị liệu, nhận liệu để thêm, sửa xóa) Packet dataaccesslayer: Thuộc lớp mô hình lớp Gồm Class Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY - AssetDatabaseOpenHelper: Có nhiệm vụ Copy file Database từ thư mục Access vào thư mục Database ứng dụng Vì ứng dụng tương tác với sở liệu thư mục databases có cấu trúc đường dẫn: ///data/data/{package bạn}/databases VD: String path = "/data/data/com.kmt.databaseaccess/databases"; (Chú ý: Bạn truy cập vào File Explorer chạy máy ảo) Nếu bạn copy file CSDL vào thư mục Access Projetc ứng dụng không gọi Khi bạn dùng lớp chạy ứng dụng, kiểm tra tồn CSDL thư mục database hay chưa, chưa copy file CSDL từ thư mục Access Project vào cho cách tự động Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY Hoặc bạn tự copy thủ công cách sau: Chọn thư mục database Packet ứng dụng thư mục File Exploder => Chọn Push a file onto the device Chọn đến file CSDL mà bạn muốn import vào, chọn Open CODE: package databaseaccess; /** * Created by locnt_000 on 9/29/2015 10 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY private static String DATABASE_TABLE = ""; private static String DATABASE_CREATE = ""; private static final int DATABASE_VERSION = 1; private Context context; private DatabaseHelper DBHelper; private SQLiteDatabase db; private ContentValues contenValues; private AssetDatabaseOpenHelper asset; public DBAdapter(Context ctx, String DATABASE_TABLE, String DATABASE_CREATE) { try { asset = new AssetDatabaseOpenHelper(ctx); asset.StoreDatabase(); // Kiểm tra, chưa copy database từ thư mục asset vào thư mục database ứng dụng copy this.context = ctx; DBHelper = new DatabaseHelper(ctx); this.DATABASE_TABLE = DATABASE_TABLE; this.DATABASE_CREATE = DATABASE_CREATE; } catch (Exception e) { Toast.makeText( ctx, "Lỗi tạo DBAdapter Error: "+ e, Toast.LENGTH_SHORT).show(); } } // /** 14 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY * Sử dụng để cập nhật, nâng cấp sở liệu * @author Jimmy * */ private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(DATABASE_CREATE); // Tạo bảng cụ thể } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS '"+ DATABASE_TABLE +"'"); // xóa bảng liệu cũ 15 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY onCreate(db); lại bảng liệu // Tạo } } // /** * Tạo sở liệu * @param DATABASE_CREATE */ public void CreateDatabase(String DATABASE_CREATE) { try { db.execSQL(DATABASE_CREATE); } catch (Exception e) { e.printStackTrace(); Toast.makeText(context, "Error CreateDatabase: "+ e, Toast.LENGTH_SHORT).show(); } } // /** * Xóa sở liệu * @param DATABASE_NAME */ public void DeleteDatabase() { try { open(); 16 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY db.execSQL("DROP TABLE IF EXISTS '"+ DATABASE_NAME +"'"); // xóa bảng liệu cũ } catch (Exception e) { Toast.makeText(context, "Error DeleteDatabase: "+ e, Toast.LENGTH_SHORT).show(); } finally { close(); } } // /** * Insert liệu vào bảng * @param DATABASE_TABLE : Tên bảng cần Insert liệu * @param fields : Mảnh chứa tên trường cần thê liệu * @param values : Mảng chứa giá trị cần thêm vào trường theo thứ tự tương ứng */ public void InsertIntoTable(String[] fields, String[] values) { try { open(); contenValues = new ContentValues(); int i = 0; long result; for (String field : fields) { contenValues.put(field, values[i]); i++; } 17 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY result = db.insert(DATABASE_TABLE, null, contenValues); if (result == -1) { // lỗi Toast.makeText(context, "Can't Insert \n Error: ", Toast.LENGTH_SHORT).show(); } else { // Ok Toast.makeText(context, "Inserted!", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { Toast.makeText(context, "Error InsertIntoTable: "+ e, Toast.LENGTH_SHORT).show(); } finally { close(); } } // /** * Update liệu vào bảng * @param DATABASE_TABLE : Tên bảng * @param fields : Danh sách trường cần cập nhật liệu * @param values : Danh sách giá trị * @param whereClause : Mệnh đề điều kiện Form: tentruong1 = ? and tentruong2 = ? or tentruong3 = ? * @param whereArgs : Danh sách tham số truyền vào mệnh đề điều kiện */ public void UpdateTable(String[] fields, String[] values, String whereClause, String[] whereArgs) { 18 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY try { open(); contenValues = new ContentValues(); int i = 0; long result; for (String field : fields) { contenValues.put(field, values[i]); i++; } result = db.update(DATABASE_TABLE, contenValues, whereClause, whereArgs); if (result == 0) { // lỗi Không có ghi tác động Toast.makeText(context, "Can't Update.", Toast.LENGTH_SHORT).show(); } else { // Ok Toast.makeText(context, "Updated!", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { Toast.makeText(context, "Error UpdateTable: "+ e, Toast.LENGTH_SHORT).show(); } finally { close(); } } // /** * Xóa ghi 19 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY * @param DATABASE_TABLE : Tên bảng cần xóa liệu * @param whereClause : Điều kiện * @param whereArgs : Giá trị tham số điều kiện * Nếu xóa hết bảng: tham số cuối để: NULL */ public void DeleteTable(String whereClause, String[] whereArgs) { try { open(); int result; result = (int) db.delete(DATABASE_TABLE, whereClause, whereArgs); if (result != 0) { // Ok Toast.makeText(context, "Inserted!", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { Toast.makeText(context, "Error DeleteTable: "+ e, Toast.LENGTH_SHORT).show(); } finally { close(); } } // /** * Truy vấn lấy liệu bảng * @param DATABASE_TABLE : Bảng cần lấy liệu 20 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY * @param columns : Các trường cần lấy * @param selection : Mệnh đề điều kiện * @param selectionArgs : Danh sách giá trị tham số * @return */ public Cursor SqlQuery(String[] columns, String selection, String[] selectionArgs) { try { open(); Cursor c = db.query(DATABASE_TABLE, columns, selection, selectionArgs, null, null, null); // giá trị null cuối mặc định là: GroupBy, Having, OrderBy return c; } catch (Exception e) { Toast.makeText(context, "Error SqlQuery: "+ e, Toast.LENGTH_SHORT).show(); return null; } finally { close(); } } // /** * Truy vấn lấy giá trị dựa vào câu truy vấn * @param sql : Câu truy vấn * @param selectionArgs : Danh sách giá trị tham số mệnh đề điều kiện (nếu có) 21 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY * @return */ public Cursor SqlRawQuery(String sql, String[] selectionArgs) { try { open(); Cursor c = db.rawQuery(sql, selectionArgs); return c; } catch (Exception e) { Toast.makeText(context, "Error SqlRawQuery: "+ e, Toast.LENGTH_SHORT).show(); return null; } finally { close(); } } // /** * - opens the database * @return * @throws SQLException */ public DBAdapter open() throws SQLException { try { 22 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY db = SQLiteDatabase.openDatabase(context.getDatabasePath(DB_NAME).getPath(), null, SQLiteDatabase.OPEN_READWRITE); } catch (Exception e) { Toast.makeText(context, "Error When Open Db: "+ e, Toast.LENGTH_SHORT).show(); } return this; } // /** * -closes the database */ public void close() { try { DBHelper.close(); } catch (Exception e) { Toast.makeText(context, "Error: "+ e, Toast.LENGTH_SHORT).show(); } } public static String getDatabaseCreate() { return DATABASE_CREATE; } public static void SetDatabaseCreate(String DATABASE_CREATE) { DBAdapter.DATABASE_CREATE = DATABASE_CREATE; } } 23 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY Packet object Sử dụng để lưu trữ giá trị đối tượng thuộc lớp SinhViên - Data Transfer Object (DTO) package object; public class SinhVien { // Các biến sử dụng cho lớp đối tượng Sinh Viên private String Name = "", ClassName = ""; private int ID = 0; // Thiết lập lấy giá trị đối tượng thuộc lớp Sinh Viên public int getID() { return ID; } public void setID(int iD) { ID = iD; } public String getName() { return Name; } public void setName(String name) { Name = name; } public String getClassName() { return ClassName; 24 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY } public void setClass(String ClassName) { ClassName = ClassName; } } Packet businesslogiclayer: Chứa Class thuộc lớp thứ mô hình lớp package businesslogiclayer; import com.kmt.Example.MainActivity; import import import import import import android.content.ContentValues; android.content.Context; android.database.Cursor; android.database.SQLException; android.database.sqlite.SQLiteDatabase; android.widget.Toast; import dataaccesslayer.DBAdapter; public class DtSinhVien { private DBAdapter dbAdapter; //private DatabaseHelper DBHelper; private final Context context; private SQLiteDatabase db; private static final int DATABASE_VERSION = 1; static final String DATABASE_CREATE = "CREATE TABLE [SinhVien] ( [ID] INTEGER DEFAULT '0' NOT NULL PRIMARY KEY AUTOINCREMENT, [Name] TEXT NULL, [Class] TEXT NULL)"; // Các biến sử liệu private static private static private static private static private static dụng cho bảng cụ thể Dùng để truy xuất, tác động final final final final final String DATABASE_TABLE = "SinhVien"; String KEY_ROWID = "id"; String KEY_NAME = "Name"; String KEY_CLASS = "Class"; String[] COLUMNS = {KEY_ROWID,KEY_NAME,KEY_CLASS }; public DtSinhVien(Context context) { this.context = context; try { dbAdapter = new DBAdapter(context, DATABASE_TABLE, DATABASE_CREATE); } catch (Exception e) { Toast.makeText(context, "Lỗi tạo đối tượng DBAdapter "+ e, Toast.LENGTH_SHORT).show(); } 25 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY } // -insert a contact into the database public void insertSinhVien(String[] fields, String[] values) { dbAdapter.InsertIntoTable(fields, values); } // -deletes a particular contact public void deleteSinhVien(String whereClause, String[] whereArgs) { dbAdapter.DeleteTable(whereClause, whereArgs); } // -retrieves all the contacts public Cursor getAllSinhVien() { try { return dbAdapter.SqlQuery(COLUMNS,null, null); } catch (Exception e) { Toast.makeText(context, "Lỗi truy vấn GetAllContact "+ e, Toast.LENGTH_SHORT).show(); return null; } } // -retrieves a particular contact public Cursor getSinhVien(long rowId) throws SQLException { String sql = "select * from " + DATABASE_TABLE + "where id = ?" ; Cursor mCursor = dbAdapter.SqlRawQuery(sql, new String[] {rowId+ ""}); return mCursor; } // -updates a contact public void updateSinhVien(String[] fields, String[] values, String whereClause, String[] whereArgs) { dbAdapter.UpdateTable(fields, values, whereClause, whereArgs); } } - - 2.4 Khai báo quyền cho ứng dụng Để ứng dụng có quyền tác động (Gọi, thêm, sửa, xóa) vào sở liệu Bạn cần khai báo quyền cho ứng dụng file AndroidManifest.xml: 26 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY 2.5 Giao diện ứng dụng - Nhập thử liệu, nhấn Insert: 27 Trương Khoan_KMT_TNUT - THÁI NGUYÊN UNIVERSITY Nhấn Get để load lại liệu: Tướng tự với sửa, xóa ******************* Chúc bạn thành công ***************************** 28 [...]... java.io.InputStream; import android. content.ContentValues; import android. content.Context; import android. database.Cursor; import android. database.SQLException; import android. database.sqlite.SQLiteDatabase; import android. database.sqlite.SQLiteOpenHelper; import android. util.Log; import android. widget.Toast; public class DBAdapter { private static final String TAG = "DBAdapter"; private static final String... setClass(String ClassName) { ClassName = ClassName; } } 4 Packet businesslogiclayer: Chứa các Class thuộc lớp thứ 2 trong mô hình 3 lớp package businesslogiclayer; import com.kmt.Example.MainActivity; import import import import import import android. content.ContentValues; android. content.Context; android. database.Cursor; android. database.SQLException; android. database.sqlite.SQLiteDatabase; android. widget.Toast;... private static private static private static dụng cho một bảng cụ thể Dùng để truy xuất, tác động dữ final final final final final String DATABASE_TABLE = "SinhVien"; String KEY_ROWID = "id"; String KEY_NAME = "Name"; String KEY_CLASS = "Class"; String[] COLUMNS = {KEY_ROWID,KEY_NAME,KEY_CLASS }; public DtSinhVien(Context context) { this.context = context; try { dbAdapter = new DBAdapter(context, DATABASE_TABLE,... THÁI NGUYÊN UNIVERSITY } // -insert a contact into the database public void insertSinhVien(String[] fields, String[] values) { dbAdapter.InsertIntoTable(fields, values); } // -deletes a particular contact public void deleteSinhVien(String whereClause, String[] whereArgs) { dbAdapter.DeleteTable(whereClause, whereArgs); } // -retrieves all the contacts public Cursor getAllSinhVien() { try { return dbAdapter.SqlQuery(COLUMNS,null,... android. widget.Toast; import dataaccesslayer.DBAdapter; public class DtSinhVien { private DBAdapter dbAdapter; //private DatabaseHelper DBHelper; private final Context context; private SQLiteDatabase db; private static final int DATABASE_VERSION = 1; static final String DATABASE_CREATE = "CREATE TABLE [SinhVien] ( [ID] INTEGER DEFAULT '0' NOT NULL PRIMARY KEY AUTOINCREMENT, [Name] TEXT NULL, [Class]... SinhVien { // Các biến sử dụng cho lớp đối tượng Sinh Viên private String Name = "", ClassName = ""; private int ID = 0; // Thiết lập và lấy các giá trị của một đối tượng thuộc lớp Sinh Viên public int getID() { return ID; } public void setID(int iD) { ID = iD; } public String getName() { return Name; } public void setName(String name) { Name = name; } public String getClassName() { return ClassName; 24 Trương... java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android. annotation.SuppressLint; import android. content.Context; import android. database.sqlite.SQLiteDatabase; import android. util.Log; public class AssetDatabaseOpenHelper { // tên file datebase trong thư mục assets private static final String DB_NAME = "MyDatabase.sqlite"; private Context context; public AssetDatabaseOpenHelper(Context... -retrieves a particular contact public Cursor getSinhVien(long rowId) throws SQLException { String sql = "select * from " + DATABASE_TABLE + "where id = ?" ; Cursor mCursor = dbAdapter.SqlRawQuery(sql, new String[] {rowId+ ""}); return mCursor; } // -updates a contact public void updateSinhVien(String[] fields, String[] values, String whereClause, String[] whereArgs) { dbAdapter.UpdateTable(fields,... Toast.LENGTH_SHORT).show(); } finally { close(); } } // /** * Insert dữ liệu vào trong một bảng bất kỳ * @param DATABASE_TABLE : Tên bảng cần Insert dữ liệu * @param fields : Mảnh chứa tên các trường cần thê dữ liệu * @param values : Mảng chứa giá trị cần thêm vào các trường theo thứ tự tương ứng */ public void InsertIntoTable(String[] fields, String[] values) { try { open();... String TAG = "DBAdapter"; private static final String DB_NAME = "MyDatabase.sqlite"; private static final String DATABASE_NAME = "MyDatabase"; 13 Trương Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY private static String DATABASE_TABLE = ""; private static String DATABASE_CREATE = ""; private static final int DATABASE_VERSION = 1; private Context context; private DatabaseHelper DBHelper; private SQLiteDatabase ... để truy xuất, tác động final final final final final String DATABASE_TABLE = "SinhVien"; String KEY_ROWID = "id"; String KEY_NAME = "Name"; String KEY_CLASS = "Class"; String[] COLUMNS = {KEY_ROWID,KEY_NAME,KEY_CLASS... hình lập trình Mô hình lớp (Three Layers) 1.2 Các thành phần – Layer Mô hình lớp cấu thành từ: Presentation Layers, Business Logic Layers, Data Access Layers Presentation Layers (Lớp 3) - Lớp làm... Khoan_KMT_TNUT THÁI NGUYÊN UNIVERSITY } // -insert a contact into the database public void insertSinhVien(String[] fields, String[] values) { dbAdapter.InsertIntoTable(fields, values); } // -deletes

Ngày đăng: 04/11/2015, 20:10

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan