SQlite Trong Android (Phần 3)

SQLite Trong Android

Phần 3: SQLite Với Image Và Cách Intent Camera Trong Android.

1. Giới thiệu.

Xin chào các bạn, Ở 2 phần trước mình đã giới thiệu đến các bạn cơ bản về SQLite trong Android, ở phần này mình sẽ hướng dẫn đến các bạn xử lý hình ảnh để lưu vào SQLite, đồng thời giới thiệu cho các bạn biết về Intent Camera trong Android để kết nối với camera của điện thoại, chụp một tấm ảnh và gửi chúng về lại phần mềm của chúng ta.

2. Cấu hình SQLite.

Đầu tiên các bạn tạo một project mới và đặt tên bất kỳ, sau đó tạo một class có tên SQL extends từ SQLiteOpenHelper để cấu hình và quản lý các thao tác trong SQLite của ứng dụng. Trong ứng dụng này, mình sẽ Demo một ứng dụng Quản lý Sản phẩm, cho phép người dùng chụp hình Sản phẩm của họ rồi thêm vào CSDL.

Bạn tạo một class SanPham để chứa các thông tin của sản phẩm nhé:

Giao diện ứng dụng đơn giản của chúng ta sẽ như sau:

Trong class SQL chúng ta cấu hình như sau:

Trong MainActivity, chúng ta sẽ tạo một CSDL và một bảng mới có tên SanPham gồm 4 trường: ID, TenSP, Gia, HinhMh:

Trong câu lệnh phía trên, trường HinhMh chúng ta sẽ để kiểu dữ liệu là Blob, vì SQLite sẽ lưu file hình ảnh của chúng ta dưới dạng một mảng Byte[], do đó để lưu chúng ta sẽ cần một hàm để chuyển đổi hình ảnh bình thường thành mảng Byte[], hàm này mình sẽ giới thiệu phía dưới.

3. Intent Camera.

Sau khi đã tạo một bảng rồi, thì công việc tiếp theo chúng ta sẽ thiết kế lại giao diện và cho người dùng chụp ảnh từ điện thoại để có dữ liệu lưu vào SQLite nhé.

Trong activity_main.xml chúng ta sẽ sửa lại như sau:

Trong MainActivity, chúng ta khai báo và Ánh xạ các View này:

Để kết nối với Camera của điện thoại, chúng ta sử dụng Intent kết hợp với với câu lệnh MediaStore, bạn bắt sự kiện Click của ImageView như sau:

Trong đó, MediaStore.ACTION_IMAGE_CAPTURE sẽ giúp kết nối tới camera, startActivityForResult(); giúp trả về dữ liệu khi chụp ảnh xong, đi kèm với nó là một biến REQUEST_CODE kiểu Int để so sánh điều kiện khi trả về dữ liệu có đúng Activity đang cần hay không, giá trị REQUEST_CODE các bạn có thể khai báo giá trị bất kỳ.

Sau khi chụp ảnh và gửi về rồi, chúng ta cần một hàm để nhận dữ liệu này và hiển thị lên trên ImageView, để nhận giá trị gửi về từ startActivityForResult(), bạn gọi phương thức onActivityResult():

Trong phương thức này, đầu tiên bạn phải kiểm tra xem biến requestCode trả về có mang giá trị giống như biến REQUEST_CODE đã khai báo hay không, vì có thể nhiều Activity sẽ có nhiều REQUEST_CODE khác nhau.

4. Thêm một Sản phẩm mới với Hình ảnh vừa chụp.

Như đã nói ở Mục 2, hình ảnh trong SQLite được lưu với dạng mảng byte[], nhưng khi hình ảnh trả về từ camera lại có kiểu dữ liệu là Bitmap. Do đó, chúng ta phải có một hàm để chuyển đổi từ kiểu Bitmap sang kiểu byte[], trong MainActivity các bạn tạo một hàm mới có tên ConverttoArrayByte() như sau:

Sau khi chuyển đổi, hàm này sẽ trả về cho chúng ta một mảng byte[], chúng ta chỉ việc lấy mảng byte[] này thêm vào CSDL mà thôi, trong class SQL, các bạn tạo một hàm mới để Insert với kiểu byte[] này:

Lúc này, class SQL đầy đủ của chúng ta:

Quay về MainActivity, các bạn bắt sự kiện Click của btnthem để tiến hành gọi hàm Insert của lớp SQL:

5. Đọc dữ liệu từ SQLite.

Đầu tiên, bạn tạo một Activity mới có tên DanhsachSP, Activity này sẽ chứa một ListView cho phép hiển thị các sản phẩm mà bạn đã thêm trong CSDL, file activity_danhsachsp.xml chúng ta code thêm một Listview vào:

Tiếp theo, các bạn tạo một file .xml mới có tên row__listview.xml dùng để custom các dòng cho ListView, ở mỗi dòng của ListView, chúng ta sẽ có 1 ImageView hiển thị ảnh đại diện và 1 TextView hiển thị tên của Sản phẩm:

Lúc chạy giao diện của chúng ta sẽ như thế này:

Tiếp theo, các bạn tạo một class có tên CustomAdapter, class này có nhiệm vụ sẽ hiển thị dữ liệu lên ListView theo định dạng trong file row_listview.xml:

Class này sẽ extends từ ArrayAdapter, trong phương thức getView(), bạn inflater file row_listview.xml lúc nãy đã tạo phía trên vào, sau đó tạo một biến từ Object SanPham để lấy các giá trị trong đó ra. Ngoài ra, để hiển thị một hình ảnh dưới dạng mảng byte[], các bạn code như sau:

Sau khi đã code class CustomAdapter xong xuôi, bạn quay về file DanhsachSP để tiến hành lấy dữ liệu và hiển thị lên ListView:

Như đã nói ở 2 Phần trước, để lấy dữ liệu từ CSDL SQLite, bạn cũng dùng một biến Cursor (Con trỏ) để lấy dữ liệu ra từ CSDL, tuy nhiên do kiểu dữ liệu của ảnh trong SQLiteBlob, nên khi lấy ra chúng ta sẽ dùng cursor.getBlob() nhé.

Để chuyển màn hình từ MainActivity sang DanhsachSP, trong MainActivity bạn bắt sự kiện onCLick() của btndanhsach:

 

6. Kết luận.

Sau khi chạy, giao diện chính của chúng ta sẽ như sau:

Danh sách các sản Phẩm đã thêm:

Như vậy là mình đã hướng dẫn xong cho các bạn phần SQLite với Image và kết nối đến Camera của điện thoại, các chức năng khác như Sửa, Xóa, Tìm Kiếm các bạn có thể tham khảo thêm ở 2 phần trước mình làm, nó cũng tương tự nhau cả thôi. Ở Phần 4, mình sẽ giới thiệu đến các bạn việc lưu 1 file Âm thanh vào SQLite và cách Ghi âm trong Android, nhớ đón theo dõi nhé!!!!!

Xin chào và Hẹn gặp lại các bạn ở Phần 4: SQLite với Âm thanh và Ghi âm trong Android.