Bài giảng Lập trình di động - Bài 6: Các phương pháp lưu trữ trong android và làm việc với SQLite

pdf 71 trang Gia Huy 17/05/2022 1930
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình di động - Bài 6: Các phương pháp lưu trữ trong android và làm việc với SQLite", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_di_dong_bai_6_cac_phuong_phap_luu_tru_tr.pdf

Nội dung text: Bài giảng Lập trình di động - Bài 6: Các phương pháp lưu trữ trong android và làm việc với SQLite

  1. LẬP TRÌNH DI ĐỘNG Bài 6: các phương pháp lưu trữ trong android và làm việc với SQLite
  2. Nội dung 1. Tổng quan về lữu trữ trong android 2. Shared Preferences 3. Files 1. File trên internal storage 2. File tạm 3. File trên external storage 4. File nội bộ (trong file apk) 4. Làm quen với SQLite 6
  3. Phần 1 Tổng quan về lưu trữ trong android 7
  4. Tổng quan: các loại lưu trữ ▪Android có nhiều phương pháp lưu trữ dữ liệu ▪ Mỗi phương pháp có mục đích sử dụng khác nhau (vì vậy cần hiểu chính xác để sử dụng hợp lý nhất) ▪ Cơ chế phân quyền và kiểm soát truy cập kiểu Linux ▪Local storages: ▪ Raw: File services (memory, cached, internal card, sdcard, ) ▪ OS services: Shared preferences, SQLite, Content providers ▪ Extra services: Content providers ▪Remote storages: Internet services 8
  5. Tổng quan: quá trình cài ứng dụng ▪Ứng dụng android ở dạng .apk ▪Từ API 8, có thể đặt ứng dụng ở sdcard: thêm đoạn mã android:installLocation="preferExternal" vào file AndroidManifest.xml ▪Quá trình ứng dụng được cài đặt vào hệ thống: ▪ Kiểm tra sự toàn vẹn của file .apk dựa trên chữ kí số ▪ Chép file .apk vào thư mục ứng dụng ▪ Tạo thư mục riêng cho ứng dụng đó (theo tên package) ▪ Thiết lập quyền phù hợp cho thư mục riêng ▪ Cập nhật CSDL về các thành phần của ứng dụng 9
  6. Tổng quan: một số folder cơ bản ▪Theo thiết lập chuẩn của Android OS: ▪ Ứng dụng hệ thống: /system/app ▪ Ứng dụng thường: /data/app ▪ Ứng dụng ở sdcard: /storage/sdcard0/.android_secure ▪ Dữ liệu của ứng dụng: /data/data/ • Folder “shared_prefs”: chứa share preferences • Folder “cache”: chứa các file tạm • Folder “databases”: chứa các CSDL SQLite ▪ Dữ liệu ở sdcard: /Android/data/ /files/ ▪Cần lấy các folder bằng API của hệ thống 10
  7. Phần 2 Shared Preferences 11
  8. Shared Preferences ▪Shared Preferences cho phép lưu trữ dữ liệu theo cặp key/value với các kiểu dữ liệu cơ bản ▪File lưu ở dạng XML, có thể chia sẻ với ứng dụng khác (mục tiêu cũng là để chia sẻ) ▪Các kiểu dữ liệu hỗ trợ: String, float, int, long và boolean ▪Cách làm việc: 1. Lấy đối tượng SharedPreferences: dùng phương thức getSharedPreferences(string, int) hoặc getPreferences(int mode) 2. Sử dụng các phương thức của class SharedPreferences để thao tác với dữ liệu bên trong 12
  9. getSharedPreferences ▪Phương thức “public abstract SharedPreferences getSharedPreferences(String xml, int mode)” ▪ Đây là phương thức của context ▪ Phương thức lấy về đối tượng SharedPreferences để đọc ghi dữ liệu lên file xml với tên được chỉ định bằng tham số truyền vào ▪ File XML phải nằm trong folder shared_prefs của data ▪ Tham số mode dùng để thiết lập quyền truy xuất đến file xml mà đối tượng SharedPreferences tham chiếu đến 13
  10. getSharedPreferences ▪Có ba loại mode: ▪ MODE_PRIVATE: chỉ có thể được truy xuất bên trong ứng dụng tạo ra nó ▪ MODE_WORLD_READABLE: có thể được đọc bởi các ứng dụng khác ▪ MODE_WORLD_WRITEABLE: có thể được ghi bởi các ứng dụng khác ▪Chú ý: ▪ Có quyền root vẫn đọc được dữ liệu dù nó thiết lập chế độ MODE_PRIVATE ▪ Có quyền ghi thì đương nhiên có quyền đọc 14
  11. getPreferences (int mode) ▪Phương thức “public SharedPreferences getPreferences(int mode)” ▪ Phương thức của activity ▪ Phương thức này sẽ gọi lại getSharedPreferences( ) với tham số String xml là tên của activity hiện tại ▪ Tham số int mode trong phương thức tương tự như tham số mode slide trước ▪Nhận xét: phương thức này giúp lập trình viên tạo SharedPreferences ứng với từng activity mà không cần quá quan tâm tới package name 15
  12. Ghi dữ liệu ▪Gọi phương thức SharedPreferences.edit() để lấy về đối tượng SharedPreferences.Editor đối tượng này sử dụng để ghi dữ liệu xuống file xml ▪Thêm dữ liệu vào file xml bằng cách gọi các phương thức putXXX: ▪ SharedPreferences.Editor.putBoolean() ▪ SharedPreferences.Editor.putString() ▪ ▪Gọi phương thức SharedPreferences.commit() để hoàn tất việc thay đổi nội dung và ghi dữ liệu 16
  13. Ví dụ Mô tả: - thiết kế 2 EditText(name,phone): nhập thông tin - 4 nút lệnh: - Save: thực hiện lưu thông tin edtName & edtPhone - Load: thực hiện load thông tin được lưu lên edtName & edtPhone (để chỉnh sửa) - Test: hiển thị thông tin lưu ra 2 textView(name,phone) dưới textview dữ liệu lưu để xem - Delete: xóa dữ liệu lưu 17
  14. Ví dụ - sự kiện click nút Save 17
  15. Ví dụ - sự kiện click nút Load 17
  16. Ví dụ - sự kiện click nút Test 17
  17. Ví dụ - sự kiện click nút Delete 17
  18. Ví dụ - thực thi 17
  19. Ví dụ - thực thi 17
  20. Ví dụ - thực thi 17
  21. Ví dụ - thực thi 17
  22. Ví dụ - thực thi 17
  23. Ví dụ - vị trí lưu 17
  24. Ví dụ - nội dung lưu 17
  25. Phần 3 Files 19
  26. Files ▪Android cung cấp khá nhiều cách để đọc và lưu trữ dữ liệu từ/xuống các tập tin ▪ Dựa trên các API về file của Java ▪ Dựa trên một số dạng đặc biệt chỉ có trong android (các tập tin tài nguyên chẳng hạn) ▪Một số dạng tập tin phổ biến ▪File trên bộ nhớ trong (internal storage) ▪File đệm (cached) ▪File trên bộ nhớ ngoài (external storage) ▪File tài nguyên (resources, nằm trong APK) 20
  27. Files (internal storage) • File trên bộ nhớ trong (internal storage) • Mặc định thì tập tin này sẽ thuộc về ứng dụng tạo ra nó và các ứng dụng khác không thể truy xuất đến nó • Vị trí lưu: /data/data/TenUngdung/files/mydata.txt • getFilesDir(): trả về đường dẫn lưu trữ vào bộ nhớ trong 20
  28. Files (internal storage) • Tạo file: 20
  29. Files (cached ) • Sử dụng khi muốn lưu trữ tập tin vào thư mục cache thay vì lưu trữ vĩnh viễn • Các tập tin này sẽ tự động bị xóa khi thiết bị thiếu bộ nhớ trong • getCacheDir() để lấy về thư mục cache lưu trữ dữ liệu của ứng dụng data/data/ /cache 20
  30. Files (cached ) • Tạo file: 20
  31. Files (external storage) • Bộ nhớ ngoài (external memory) là thiết bị lưu trữ có thể tháo rời (thường là SDCARD) nên cần tiến hành kiểm tra trạng thái trước khi đọc và ghi dữ liệu 20
  32. Files (external storage) • Nếu muốn ghi trên SDCARD, cần cấp quyền android.permission.WRITE_EXTERNAL_STORAGE • Truy cập file ở bộ lưu trữ ngoài • API Level >= 8, sử dụng getExternalFilesDir() lấy về đối tượng file chứa đường dẫn tới thư mục gốc bộ nhớ ngoài • API Level /files/ • Dữ liệu trên sdcard có thể không được bảo vệ 20
  33. Files (external storage) • Tạo file: 20
  34. Files – ghi dữ liệu FileWriter • FileWriter là một lớp luồng ký tự dùng để ghi các ký tự vào file. • Để thay thế toàn bộ nội dung đã có bằng nội dung mới : new FileWriter(file) • Để giữ lại nội dung đã có và nối thêm nội dung mới vào cuối file : new FileWriter(file,true) 20
  35. Files – ghi dữ liệu FileWriter • FileWriter là một lớp luồng ký tự dùng để ghi các ký tự vào file. • Để thay toàn bộ nội dung đã có bằng nội dung mới: FileWriter fw = new FileWriter(file) • Để giữ lại nội dung đã có và nối thêm nội dung mới vào cuối file : FileWriter fw = new FileWriter(file,true) • Ghi dữ liệu vào file fw.write(“dữ liệu ghi”) • Xóa bộ nhớ đệm: fw.flush() • Đóng, kết thúc quá trình ghi file fw.close() 20
  36. Files – ghi dữ liệu FileWriter • Ví dụ: ghi dữ liệu vào file data.txt trong bộ nhớ cached 20
  37. Files – đọc dữ liệu FileReader • FileReader là một lớp - được sử dụng để đọc các luồng ký tự. • Cú pháp tạo mới reader FileReader fr = new FileReader(file) • Luồng trả về của reader là các ký tự(char) • BufferedReader là class xuất nhập dữ liệu theo luồng ký tự (Character) mà Reader là class cha. BufferedReader br=new BufferedReader(fr) 20
  38. Files – đọc dữ liệu FileReader • Đọc dữ liệu từng dòng trong BufferedReader while((row = br.readline()) != null){ // hiển thị row; } • Kết thúc đọc dữ liệu br.close() 20
  39. Files – đọc dữ liệu FileReader • Ví dụ: đọc dữ liệu từ file data.txt được lưu trong bộ nhớ cached 20
  40. Files ▪File trên bộ nhớ trong (internal storage) ▪File đệm (cached ) ▪File trên bộ nhớ ngoài (external storage) ▪File tài nguyên (resources, nằm trong APK) 20
  41. Các thư mục chuẩn Android SDK định nghĩa một số thư mục chuẩn thành hằng số trong class android.os.Environment ▪ DIRECTORY_ALARMS ▪ DIRECTORY_DCIM (picture + video ở chế độ device as camera) ▪ DIRECTORY_DOCUMENTS ▪ DIRECTORY_DOWNLOADS ▪ DIRECTORY_MOVIES ▪ DIRECTORY_MUSIC ▪ DIRECTORY_NOTIFICATIONS ▪ DIRECTORY_PICTURES ▪ DIRECTORY_PODCASTS ▪ DIRECTORY_RINGTONES 28
  42. Ví dụ: một số hàm hữu ích 29
  43. Truy xuất các files trong Resources ▪Nếu ứng dụng đòi hỏi nguồn tài nguyên từ tập tin bên ngoài, có thể gộp chúng vào thư mục res/raw trong dự án ▪Sử dụng phương thức openRawResource lấy về luồng InputStream ▪Không thể ghi vào resource Resources myResources = getResources(); InputStream myFile = myResources. openRawResource(R.raw. ); 34
  44. Truy xuất các files trong Resources • Tạo folder raw: File → New → Folder → Raw resources folder • Thư mục raw được tạo ra năm trong res 34
  45. Truy xuất các files trong Resources • Ví dụ tạo một file text trong thư mục raw chứa nội dung “đây là dữ liệu”. Sau đó đọc dữ liệu từ file text đó ra một textView như sau: 34
  46. Bài tập • Tạo một project có giao diện như sau: Mô tả yêu cầu từ giao diện: • EditText (edtName): nhập tên • EditText (edtPhone): nhập số điện thoại • SAVE INTERNAL(Button): lưu dữ liệu trên 2 EditText vào file data.txt thuộc bộ nhớ trong • LOAD INTERNAL(Button): hiển thị dữ liệu lưu trong data.txt thuộc bộ nhớ trong lên 2 EditText • SAVE CACHE(Button): lưu dữ liệu trên 2 EditText vào file data.txt thuộc bộ nhớ cached • LOAD CACHE(Button): hiển thị dữ liệu lưu trong data.txt thuộc bộ nhớ cached lên 2 EditText • SAVE EXTERNAL(Button): lưu dữ liệu trên 2 EditText vào file data.txt thuộc bộ nhớ ngoài • LOAD EXTERNAL(Button): hiển thị dữ liệu lưu trong data.txt thuộc bộ nhớ ngoài lên 2 EditText • READ(Button): hiển thị dữ liệu lưu trong data.txt thuộc bộ nhớ trong lên 2 TextView bên dưới • READ CACHE(Button): hiển thị dữ liệu lưu trong data.txt thuộc bộ nhớ cached lên 2 TextView bên dưới • R.EXTERNAL(Button): hiển thị dữ liệu lưu trong data.txt thuộc bộ nhớ ngoài lên 2 TextView bên dưới • R.RESOURCE(Button): hiển thị dữ liệu lưu file data.txt trong thư mục res/raw lên 2 TextView bên dưới 34
  47. Phần 4 SQLite 38
  48. Giới thiệu ▪SQLite là một CSDL nhỏ gọn, viết bằng C++ và được tích hợp trên rất nhiều hệ điều hành di động ▪SQLite được tích hợp vào HĐH, vì thế mọi ứng dụng đều có thể làm việc được mà không cần thư viện hỗ trợ ▪Mỗi CSDL SQLite thường là một file duy nhất, LTV mở file đó (giống như mở file thông thường) sau đó thực hiện các câu lệnh SQL để thao tác file ▪Không nên lạm dụng SQLite vì khá chậm (làm việc trên text) và thiếu uyển chuyển 39
  49. SQLite API ▪Gói android.database.sqlite chứa các class hỗ trợ làm việc với CSDL SQLite, 2 class quan trọng: ▪ SQLiteDatabase: class giúp chúng ta làm việc trực tiếp với file CSDL, thực thi các thao tác CSDL bằng SQL hoặc bằng các phương thức hỗ trợ của class ▪ SQLiteOpenHelper: class giúp lập trình viên quản lý việc, tạo và nâng cấp file CSDL ▪Android SDK cung cấp công cụ sqlite3 giúp tương tác với CSDL thông qua dòng lệnh, các LTV có thể dùng công cụ này để kiểm tra lại kết quả làm việc với file CSDL một cách nhanh chóng 40
  50. Các method của SQLiteDatabase ▪Tạo/Mở CSDL: openDatabase ▪Đóng CSDL: close ▪Thực thi SQL: execSQL ▪Chèn dữ liệu: insert ▪Cập nhật dữ liệu: update ▪Xóa dữ liệu: delete ▪Thực hiện truy vấn SELECT: rawQuery 41
  51. Ví dụ đơn giản • Mô tả yêu cầu: • MAKE DATABASE(button): Tạo CSDL qlhs.sqlite • MAKE TABLE(button): Tạo bảng Danhsach(id, TenHS) • edtTen(EditText): nhập tên HS | hiển thị tên HS • INSERT DATA(button): Thêm dữ liệu từ edtTen vào bảng Danhsach • LOAD DATA(button): chọn tất cả dữ liệu trong bảng Danhsach hiển thị mẫu tin đầu tiên lên edtTen • UPDATE DATA(button): lưu chỉnh sửa dữ liệu từ edtTen vào bảng Danhsach • DELETE DATA(button): xóa dữ liệu hiển thị từ edtTen và trong bảng Danhsach • PRE(button): di chuyển mẫu tin về trước hiển thị trên edtTen • NEXT(button): di chuyển mẫu tin về sau hiển thị trên edtTen 42
  52. Ví dụ đơn giản • Một số khai báo toàn cục cần thiết – Đối DB thuộc lớp SQLiteDatabase quản lý kết nối, truy cập CSDL – cursor thuộc lớp Cursor nhận dữ liệu từ các lệnh sql có kết quả trả về 42
  53. Ví dụ đơn giản • Hàm createOrOpenDB(): tạo hoặc mở CSDL • Đối số truyền vào: tên của cơ sở dữ liệu và chế độ muốn mở, MODE_PRIVATE - cơ sở dữ liệu có thể truy cập chỉ đối với ứng dụng. • Hàm được gọi tại OnCreate() của mainActivity và sự kiện onClick của nút MAKE DATABASE • Đối tượng DB được khởi tạo – sẵn sàng cho các chức năng truy cập dữ liệu. 42
  54. Ví dụ đơn giản • Sự kiện click nút MAKE TABLE: thực hiện tạo bảng Danhsach (Id, TenHS) • DB.execSQL(sql) thực hiện câu lệnh sql 42
  55. Ví dụ đơn giản • Khi đó CSDL được tạo và lưu tại thư mục của ứng dụng: data/data/ /databases 42
  56. Ví dụ đơn giản • Sự kiện click nút INSERT DATA 42
  57. Ví dụ đơn giản • Sự kiện click nút LOAD DATA 42
  58. Ví dụ đơn giản • Sự kiện click nút LOAD DATA • Hàm loadAllData “giải thích cursor” 42
  59. Ví dụ đơn giản • Sự kiện click nút UPDATE DATA 42
  60. Ví dụ đơn giản • Sự kiện click nút DELETE 42
  61. Ví dụ đơn giản • Sự kiện click nút PRE 42
  62. Ví dụ đơn giản • Sự kiện click nút NEXT 42
  63. Ví dụ đơn giản • Xem Demo 42
  64. SQLiteDatabase – Insert • Phương thức insert : Thêm dữ liệu insert(String table, String nullColumnHack, ContentValues values) • "table": tên bảng muốn insert dữ liệu • "nullColumnHack": tên cột nào đó nhận giá trị NULL (dùng trong trường hợp values = null) • "values": danh sách các cặp - sẽ chèn vào dòng mới • Chú ý: hàm trả về giá trị row ID của dòng vừa chèn vào, nếu không thành công sẽ trả về -1 42
  65. SQLiteDatabase – Insert • Sự kiện click của INSERT DATA có thể viết lại 42
  66. SQLiteDatabase – Update • Phương thức update : cập nhật dữ liệu update(String table, ContentValues values, String whereClause, String[] whereArgs) • table: tên bảng muốn update • values: các cặp key/value – tên cột/giá trị mới muốn cập nhật • whereClause: điều kiện để dòng được chọn • whereArgs: mảng các giá trị ứng với whereClause • Giá trị trả về: số bản ghi được cập nhật 42
  67. SQLiteDatabase – Update • Sự kiện UPDATE DATA có thể được viết lại 42
  68. SQLiteDatabase – Delete • Phương thức delete : xóa dữ liệu delete(String table, String whereClause, String[] whereArgs) • table: tên bảng muốn xóa • whereClause: điều kiện xóa • whereArgs: mảng giá trị ứng với whereClause • Giá trị trả về: số bản ghi được xóa 42
  69. SQLiteDatabase – Delete • Sự kiện DELETE DATA có thể được viết lại 42
  70. SQLiteDatabase – Select • Phương thức rawQuery : trả về một đối tượng Cursor. – Một Cursor đại diện cho kết quả một truy vấn, – Cursor có thể đệm kết quả một cách hiệu quả, mà không cần load tất cả dữ liệu trong bộ nhớ public Cursor rawQuery(String sql, String[] selectionArgs) • sql: câu lệnh truy vấn • selectionArgs: mảng giá trị các tham số trong câu lệnh sql (nếu có) • Giá trị trả về: Đối tượng Cursor 42
  71. SQLiteDatabase - Cursor • Cursor trỏ tới 1 dòng trong kết quả trả về • Dùng cursor để đọc giá trị trên các cột của dòng đó • Khởi đầu cursor ở vị trí before-first • Cursor có nhiều phương thức hỗ trợ: • Kiểm tra vị trí hiện tại: isFirst(), isLast(), isBeforeFirst(), isAfterLast() • Dịch chuyển trong kết quả: moveToFirst(), moveToLast(), moveToNext(), moveToPrevious(), move(n) • Lấy dữ liệu: getInt, getString, getFloat, getBlob, getDate, • Lấy cấu trúc bảng: getCount, getColumnName, getColumnNames, getColumnIndex, getColumnCount, 16