Google android - SQLite

SQLite là một hệ thống cơ sở dữ liệu mã

nguồn mở được nhúng vào bên trong các

ứng dụng mà nó phục vụ.

 SQLite như là một engine cơ sở dữ liệu

SQL, được viết dưới dạng các thư viện bằng

ngôn ngữ C.

pdf58 trang | Chia sẻ: Mr Hưng | Lượt xem: 894 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Google android - SQLite, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
GOOGLE ANDROID GV: ThS. Phan Nguyệt Minh minhpn@uit.edu.vn ltdd.up@gmail.com Site môn học SQLite Sơ lược về SQLite  SQLite là một hệ thống cơ sở dữ liệu mã nguồn mở được nhúng vào bên trong các ứng dụng mà nó phục vụ.  SQLite như là một engine cơ sở dữ liệu SQL, được viết dưới dạng các thư viện bằng ngôn ngữ C. 3Lập trình trên thiết bị di động Lịch sử ra đời SQLite Richard Hipp 8/2000 General Dynamics,Hải Quân Hoa Kỳ, tàu khu trục Informix GNU Database Manager 4Lập trình trên thiết bị di động Kiến trúc 5Lập trình trên thiết bị di động Đặc điểm của SQLite  Không cần cấu hình  Di động  Nhỏ gọn  Đơn giản  Linh hoạt 6Lập trình trên thiết bị di động Sử dụng SQLite 7Lập trình trên thiết bị di động 8SQLite trong Android Lập trình trên thiết bị di động Yếu điểm của SQLite  MAX_DB_SIZE? Nếu theo cơ chế lưu toàn bộ data trên 1 file thì chạy trên Windows sẽ bị giới hạn 2GB -> 4GB tùy thuộc dùng FAT32 hoặc NTFS.  Cho phép nhập kiểu dữ liệu động - dynamically typed (Vd: có thể chèn một dữ liệu kiểu string vào một column kiểu integer)  Chưa hỗ trợ Foreign Key  Chưa hỗ trợ các lệnh ALTER TABLE: DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT  Chưa hỗ trợ các lệnh INSERT, DELETE, UPDATE trực tiếp trên VIEW nhưng có thể thực hiện trong TRIGGER Lập trình trên thiết bị di động 9 Đặc điểm của SQLite • Thƣ viện nguồn mở và đƣợc tích hợp sẵn trong Android • Không có server, hoạt động trực tiếp trên file • 3 kiểu dữ liệu: Text, Integer, Real Lập trình trên thiết bị di động 10 SQLiteOpenHelper • Giúp tạo các cơ sở dữ liệu dùng SQLite • onCreate(SQLiteDatabase db) : được gọi khi csdl được tạo, dùng khi mà tạo bảng, tạo view hoặc là trigger. • onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): được dùng khi sửa cơ sở dữ liệu như thay đổi bảng, xóa, tạo bảng mới. 11Lập trình trên thiết bị di động Thao tác • Thực thi Query qua việc dùng QueryString tương tự như SQL • Dùng các câu lệnh như insert(), delete(), update() Lập trình trên thiết bị di động 12 Cursors • Con trỏ chỉ tới vị trí của hàng trong dữ liệu • Có các phương thức như isFirst, isLast, moveToNext,.. Lập trình trên thiết bị di động 13 ContentValues • kiểu dữ liệu dùng để lưu trữ dữ liệu và đưa vào bảng • Gồm có key và value Lập trình trên thiết bị di động 14 MỞ CƠ SỞ DỮ LIỆU public DBAdapter open() { mDbHelper = new DatabaseHelper(mContext, DATABASE_NAME, null, DATABASE_VERSION); mDB = mDbHelper.getWritableDatabase(); return this; } Lập trình trên thiết bị di động 15 Thêm public long insertData(String name, String hotness) { ContentValues cv = new ContentValues(); cv.put(KEY_NAME, name); cv.put(KEY_HOTNESS, hotness); return ourDatabase.insert(DATABASE_TABLE, null, cv); } Lập trình trên thiết bị di động 16 Cập nhật public void updateData(long lRow, String eName, String eHotness) { ContentValues cvUpdate = new ContentValues(); cvUpdate.put(KEY_NAME, eName); cvUpdate.put(KEY_HOTNESS, eHotness); ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_ROWID + "=" + lRow, null); } Lập trình trên thiết bị di động 17 Xóa public void deletleEntry(long lRow1) { ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + lRow1, null); } Lập trình trên thiết bị di động 18 Broadcast Receiver Tổng quan  BroadcastReceiver (có thể gọi là Receiver) là một trong bốn loại thành phần trong ứng dụng Android. Chức năng dùng để nhận các sự kiện mà các ứng dụng hoặc hệ thống phát đi.  Có 2 cách phát-nhận đó là: ◦ Không có thứ tự: receiver nào đủ điều kiện thì nhận hết, không phân biệt và cũng tách rời nhau. ◦ Có thứ tự: receiver nào đăng ký ƣu tiên hơn thì nhận trƣớc, và có thể truyền thêm thông tin xử lý cho các receiver sau. 20Lập trình trên thiết bị di động Lifecycle  Thực ra lifecycle của BroadcastReceiver chỉ có duy nhất một phƣơng thức onReceive(). ◦ Khi có sự kiện mà BroadcastReceiver đã đăng ký nhận đƣợc phát đi, thì phƣơng thức onReceive() của BroadcastReceiver đó sẽ đƣợc gọi. ◦ Sau khi thực thi xong phƣơng thức này, lifecycle của Receiver kết thúc. 21Lập trình trên thiết bị di động Lƣu ý khi sử dụng  Ngay khi onReceive() kết thúc, hệ thống coi nhƣ receiver đã không còn hoạt động và có thể kill process chứa receiver này bất cứ lúc nào. Tránh xử lý các code quá lâu trong onReceive().  Không có xử lý bất đồng bộ, chờ callback trong Receiver (cụ thể nhƣ hiển thị Dialog, kết nối service) 22Lập trình trên thiết bị di động Một số broadcast thông dụng  Báo hệ thống khởi động xong  Báo pin có sự thay đổi  Báo có package mới cài vào hoặc xóa đi  Báo tắt máy  Báo cắm sạc, rút sạc 23Lập trình trên thiết bị di động Một số broadcast khác  Thông báo tin nhắn tới  Thông báo cắm, rút thẻ nhớ  Thông báo có cuộc gọi đi  Có thể định nghĩa broadcast cho riêng mình (mục tiêu chính của việc này giúp liên lạc giữa các ứng dụng hoặc thông báo một sự kiện liên quan đến các ứng dụng khác) 24Lập trình trên thiết bị di động onReceive()  Phƣơng thức này đƣợc gọi khi có sự kiện tƣơng ứng đƣợc phát đi. Ở trong phƣơng thức này, ta thấy truyền vào context và intent. ◦ Vì Receiver không kế thừa từ Context nên cần truyền context mà receiver này đang chạy vào. Thứ nhất, để có thể xử lý các phƣơng thức yêu cầu truyền thêm Context, thứ 2, để sử dụng các phƣơng thức của lớp Context. 25Lập trình trên thiết bị di động onReceive() ◦ Intent đƣợc truyền vào sẽ có đầy đủ thông tin nhƣ sự kiện nào mà receiver này đăng ký đã xảy ra dẫn đến onReceive() đƣợc gọi. Có gửi kèm thông tin gì hoặc dữ liệu gì hay không. Intent.getAction() Intent.getExtra(String dataName) 26Lập trình trên thiết bị di động Ví dụ BootReceiver  Có thể đăng ký nhận sự kiện hệ thống vừa khởi động xong để có thể làm việc gì đó ngay, hoặc vận hành song song với hệ thống  Ta sẽ đăng ký nhận sự kiện BOOT_COMPLETED, sau đó sẽ gọi một dialog lên hiển thị lời chào.  Khi hệ thống khởi động xong sẽ xuất một dialog chào user 27Lập trình trên thiết bị di động Ví dụ BootReceiver  Trong manifest, cần đăng ký permission đƣợc nhận sự kiện này <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  Khai báo receiver bên trong thẻ application 28Lập trình trên thiết bị di động Ví dụ BootReceiver  Ở đây ta khai báo trong manifest là ứng dụng có một receiver tên là BootReceiver  BootReceiver này đăng ký nhận sự kiện “hệ thống khởi động hoàn tất”.  Dĩ nhiên, muốn nhận sự kiện dạng này thì cần phải đăng kí trƣớc với hệ thống qua permission để user đƣợc biết. 29Lập trình trên thiết bị di động Ví dụ BootReceiver  Tạo một class mới trong source, tên là BootReceiver kế thừa BroadcastReceiver.  Implement lại phƣơng thức onReceive() if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent helloIntent = new Intent(context, HelloBootActivity.class); helloIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(helloIntent); } 30Lập trình trên thiết bị di động Ví dụ BootReceiver  Giải thích: vì Receiver không kế thừa context nên khi tạo intent mới không truyền this vô đƣợc, thay vào đó truyền context đã đƣợc gửi kèm.  Vì không ở trong 1 activity mà đang ở trong 1 receiver, và một số vấn đề liên quan tới task trong Android nên phải thêm cờ Intent.FLAG_ACTIVITY_NEW_TASK (chỉ có thể không dùng cờ này khi gọi startActivity() từ một activity) 31Lập trình trên thiết bị di động Ví dụ BootReceiver  Ứng dụng có một activity tên là HelloBootActivity, activity này sẽ chỉ hiển thị dạng dialog, và sẽ không đƣợc start bằng cách bấm vào icon trên màn hình. Vì thế, khai báo trong manifest nhƣ sau: <activity android:name=".HelloBootActivity" android:theme="@android:style/Theme.Dialog">  Còn activity chỉ hiển thị một cái TextView là “Chào bạn, mới khởi động xong” và một Button để bấm vào đó thì đóng activity. 32Lập trình trên thiết bị di động Phát sự kiện  Có thể phát một sự kiện cho các receiver khác nhận dạng nhƣ sau: Intent intent = new Intent("org.multiuni.android.BROADCAST_DEMO"); sendBroadcast(intent);  Hoặc: sendOrderedBroadcast(intent, "permission tùy ý hoặc null");  Ngoài ra còn có một số cách gửi broadcast khác, tham khảo thêm trong class ContextWrapper 33Lập trình trên thiết bị di động Service Tổng quan  Là một trong 4 loại thành phần của một ứng dụng.  Service chạy nền và không tƣơng tác trực tiếp với ngƣời dùng.  Tham khảo: oid/app/Service.html 35Lập trình trên thiết bị di động Lifecycle – startService() onCreate() onStart() onDestroy()Service đang chạy Service được start lần đầu Service lại được yêu cầu start trong khi đã chạy rồi Bên ngoài gọi stopService() hoặc service tự stop 36Lập trình trên thiết bị di động Lifecycle – startService()  Khi có một context nào đó gọi startService() để start service mong muốn. Nếu service đó chƣa đƣợc tạo thì sẽ gọi onCreate() rồi gọi tiếp onStart() và khi đó service chạy nền bên dƣới.  Nếu sau đó lại có một context muốn start service này mà service đã đang chạy, chỉ có phƣơng thức onStart() của service đƣợc gọi.  Dù service có đƣợc gọi start bao nhiêu lần thì cũng chỉ có 1 instance của service và chỉ cần gọi stopService() một lần để kết thúc service. 37Lập trình trên thiết bị di động Lifecycle – bindService() onCreate() onBind() Service đang chạy Activity gọi bindService() để kết nối tới service Bên ngoài gọi unbindService() hoặc kết nối bị ngắt onUnbind() Service không còn kết nối với client nào nữa và cũng ko có context nào start service này onDestroy() Service còn chạy, client muốn kết nối với service onRebind() Lần trước unBind() với client này trả về true 38 Lập trình trên thiết bị di động Lifecycle – bindService()  Thông thƣờng, lifecycle của service khi có client kết nối từ đầu nhƣ sau: ◦ Cũng bắt đầu bằng onCreate() rồi đến onBind() và service chạy background. ◦ Khi không còn client kết nối tới thì service gọi onUnbind() rồi onDestroy(). 39Lập trình trên thiết bị di động Lifecycle  Có một số trƣờng hợp không thông thƣờng, ví dụ nhƣ: ◦ Có một context khởi động (start) một service, sau đó có một số client kết nối (bind) tới service ◦ Có nhiều client cùng lúc kết nối (bind) tới service ◦ Một activity vừa gọi startService() vừa gọi bindService() ◦ 40Lập trình trên thiết bị di động Sử dụng service ◦ Dùng trong các ứng dụng nghe nhạc. ◦ Dùng để xử lý các thao tác mất thời gian và không nhất thiết phải hiển thị lên activity (download, upload) ◦ Đôi khi cần một ứng dụng vận hành liên tục để xử lý những việc mong muốn mà không làm phiền ngƣời dùng service ◦ Làm những thao tác tính toán, xử lý đều đặn nào đó và kết quả khi nào ngƣời dùng cần thì mới xem 41Lập trình trên thiết bị di động Thread Thread  Thông thƣờng dùng Thread để xử lý các code xử lý nặng, hoặc mất thời gian có thể gây chậm chƣơng trình hoặc giao diện bị block.  Thread khá thông dụng và trong Android dùng lớp Thread của Java.  Mặc định, mỗi ứng dụng chạy trong một process và code đƣợc thực thi trong thread chính của process đó. 43Lập trình trên thiết bị di động Thread  Nếu code xử lý quá lâu, không kịp phản hồi lại các sự kiện ngƣời dùng trong 5 giây thì sẽ xuất hiện dialog “Application is not responding” và ngƣời dùng có thể force close ứng dụng ngay lập tức.  Dù không bị force close thì việc ứng dụng bị lag là khó chấp nhận.  Tham khảo thêm link sau: 44Lập trình trê thiết bị di động Thread Thread thread = new Thread() { @Override public synchronized void start() { // Khởi tạo các đối tượng cần thiết tại đây super.start(); } @Override public void run() { // code xử lý chính của thread trong này super.run(); } }; thread.start(); //bắt đầu thread 45Lập trình trên thiết bị di động Thread  Lƣu ý: ◦ Thread lần đầu thực thi gọi phƣơng thức start(), những lần sau chỉ gọi phƣơng thức run(), không gọi start() nữa. ◦ Các code xử lý liên quan đến giao diện chỉ đƣợc xử lý trong thread chính của ứng dụng (ví dụ load ảnh từ mạng về thì dùng thread, nhƣng hiển thị ảnh lên ImageView thì xử lý trong thread chính) ◦ Sau khi thực thi xong phƣơng thức run(), thread không còn active nữa. 46Lập trình trên thiết bị di động Handler  Trong Android, để tiện việc giao tiếp giữa 2 thread ta dùng đối tƣợng Handler.  Ngoài ra, có thể dùng Handler để đặt xử lý một yêu cầu nào đó sau một khoảng thời gian xác định. 47Lập trình trên thiết bị di động Handler  Giao tiếp giữa 2 Thread: ◦ Giả sử trong phƣơng thức run() của Thread, đã lấy xong đối tƣợng Bitmap về. Muốn truyền đối tƣợng Bitmap cho Thread chính hiển thị lên màn hình: Message msg = mHandler.obtainMessage(1, bitmap); mHandler.sendMessage(msg); ◦ Trong code của Activity (mặc định là thread chính), ta khai báo một đối tƣợng Handler tƣơng tứng nhƣ sau: 48Lập trình trên thiết bị di động Handler Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 1) { //Hiển thị Bitmap mImageView.setImageBitmap((Bitmap)msg.obj); } super.handleMessage(msg); } }; 49Lập trình trên thiết bị di động Handler  Nhờ đối tƣợng mHandler lấy ra một message và gắn mã vào cho message đó, kèm theo đối tƣợng bitmap. Sau đó gửi đi.  Message gửi đi sẽ nhận phƣơng thức callback là handleMessage() của đối tƣợng Handler.  Handler còn có thể gửi message để xử lý sau một khoảng thời gian định sẵn sendMessageAtTime hoặc xử lý tại một thời điểm định sẵn sendMessageDelayed có thể tìm hiểu thêm trong tài liệu của lớp Handler 50Lập trình trên thiết bị di động Handler  Handler đƣợc tạo trong thread nào thì sẽ sử dụng message queue của thread đó.  Có thể dùng Handler nhƣ bộ đếm giây khi chơi nhạc, hoặc chức năng tƣơng tự  Lƣu ý là nếu trong message queue vẫn còn message thì vẫn còn thực thi dù đã thoát khỏi ứng dụng. 51Lập trình trên thiết bị di động AlarmManager  Dùng AlarmManager để thực hiện đăng ký xử lý một thao tác nào đó tại một thời điểm nhất định trong tƣơng lai (thƣờng là thời gian dài).  Nếu xử lý trong thời gian ngắn thì khuyến cáo nên dùng Handler.  Ƣu điểm của AlarmManager, khi đến thời điểm đƣợc định trƣớc, dù ứng dụng đang không chạy vẫn đƣợc gọi.  Nếu tắt máy thì bật lại cũng không còn (lƣu ý điểm này) 52Lập trình trên thiết bị di động AlarmManager  Khởi tạo một alarm: AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); Intent broadcastIntent = new Intent("org.multiuni.android.ACTION..."); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, broadcastIntent, PendingIntent.FLAG_CANCEL_CURRENT); am.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent); 53Lập trình trên thiết bị di động AlarmManager  Giải thích: ◦ Khởi tạo một đối tƣơng AlarmManager để làm việc với Alarm. ◦ Tạo một intent tên broadcastIntent, intent này đƣợc dùng để gửi broadcast khi đến thời điểm định sẵn. ◦ PendingIntent đƣợc khởi tạo gồm context, broadcastIntent ở trên và một cờ báo rằng nếu đã có một Alarm tƣơng tự thì bỏ nó đi và dùng cái mới này. 54Lập trình trên thiết bị di động AlarmManager ◦ Sau cùng, set alarm với 3 thông số:  Bộ đếm thời gian (có 4 loại, xem trong document của AlarmManager)  Thời gian chính xác để bật alarm lên.  PendingIntent gửi đi (dùng để xác định tới thời điểm bật alarm lên thì cần phát intent nào) 55Lập trình trên thiết bị di động Notification  Trong những trƣờng hợp muốn hiện một thông báo về một sự kiện nào đó cho ngƣời dùng mà không muốn ảnh hƣởng đến công việc của họ hoặc không chắc họ có đang cầm điện thoại (tin nhắn, cuộc gọi, email)  Hoặc muốn hiển thị thông tin một việc nào đó đang xảy ra trên điện thoại và mong ngƣời dùng biết (đang nghe nhạc, đang trong cuộc gọi, thiếu thẻ nhớ)  Notification 56Lập trình trên thiết bị di động Notification  Có thể tạo một notification có âm báo, rung, đèn led, icon  Notification có 2 dạng: ◦ One time ◦ On going  Xem chi tiết tại onManager.html 57Lập trình trên thiết bị di động Q/A Lập trình trên thiết bị di động 58

Các file đính kèm theo tài liệu này:

  • pdfltttbd_chuong3_p3_3129.pdf
Tài liệu liên quan