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.
58 trang |
Chia sẻ: Mr Hưng | Lượt xem: 894 | Lượt tải: 0
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:
- ltttbd_chuong3_p3_3129.pdf