BACKEND AS A SERVICE - Information Technology Firebase.pdf · •...
Transcript of BACKEND AS A SERVICE - Information Technology Firebase.pdf · •...
www . i t s c i .m ju . ac . t h / sayan
BACKEND AS A SERVICE (BaaS) : FIREBASE
SAYAN UNANKARD
8
ข้อมูลอยู่ที่ไหนบน ANDROID?
ระบบฐานข้อมูลสามารถถูกจัดเก็บได้หลายที่ ขึ้นอยู่กับขนาดของฐานข้อมูล• ภายในเครื่องมือถือ Android เรียกว่า local database
• บน remote web server เครื่องเดียว
• กระจายอยู่บน remote web server หลายๆ ตัว หรือ บน cloud
2
การใช้งาน REMOTE DATABASE
โดยทั่วไป Android จะใช้ระบบฐานข้อมูลที่ถูกฝังมากับระบบปฏิบัติการเรียกว่า SQLite แต่เนื่องจากบาง App จ าเป็นต้องแชร์ข้อมูลร่วมกับกับผู้อื่น ๆ ดังนั้นการจัดเก็บฐานข้อมูลไว้ที่ตัวเครื่องมือถือจึงไม่สามารถท าได้
การสร้าง Remote database คือการสร้างฐานข้อมูลไว้บนเว็บเซิร์ฟเวอร์
3
การใช้งาน REMOTE DATABASE
Remote database ถูกติดตั้งบน WEB SERVER ซึ่งโดยทั่วไปเรียกว่า App’s back-end
การเริ่มใช้งานฐานข้อมูลที่เป็นส่วนของ web Server นั้นจ าเป็นต้องก าหนดสิทธิ์การเข้าใช้งานในระบบฐานข้อมูลตัวนั้น ๆ เช่น MySQL, Oracle หรือ MS SQL Server
• สร้าง username และ password ส าหรับเข้าใช้งานฐานข้อมูล
4
Select * From Student
Data rows
JDBC
การติดต่อฐานข้อมูลสามารถท าได้โดยใช้ JDBC – Java Database Connectivity
5
PROBLEM WITH REMOTE DATABASE
นอกจากปัญหาในการจัดการฐานข้อมูลเองแล้ว ยังมีส่วนอื่น ๆ ที่เป็นปัญหาในการใช้ Remote DB • Cost : ราคาการติดตั้งและการบ ารุงรักษาค่อนข้างสูง
• Administration : จ าเป็นต้องติดต้ัง ดูแลรักษา ทั้ง Server และ Database ด้วยตนเอง
• Security & Privacy : จ าเป็นต้องจัดการเรื่องของการก าหนดสิทธิ์การใช้งานและความปลอดภัยต่าง ๆ ของ Server เอง
• Robustness : ความเสถียร์ของฐานข้อมูล จ าเป็นต้องมีการจัดการ backup ข้อมูล การกู้คืนกรณีที่ระบบฐานข้อมูลมีปัญหา
• Scaling : การจัดการขนาดของฐานข้อมูล หากมีผู้ใช้ query ข้อมูลพร้อมกันหลาย ๆ เครื่องจะต้องจัดการป้องกันไม่ให้ความเร็วในการเข้าถึงข้อมูลลดลง
6
WEB SERVICES TO DB
ในปัจจุบันการเข้าถึงฐานข้อมูลที่เป็นที่นิยมจะท าผ่าน Web Layer โดยที่• Client จะร้องขอการท างานของฐานข้อมูลผ่าน URL
• Web Server จะส่งข้อมูลกลับมาให้ยัง App ผ่านรูปแบบต่าง ๆ เช่น JSON, XML
7
www.itsci.mju.ac.th/getStudent?id=1234
Data as xml/json…
Web Server
DB Server
BaaS – BACKEND AS A SERVICE
BaaS เป็นแฟลตฟอร์มส าหรับ Database/Service Hosting, Management และ Deployment ตัวอย่างเช่น Firebase, Google App Engine, Amazon Web Service Mobile, Oracle Mobile Cloud Service และ Azure
8
FIREBASE
Firebase เป็น BaaS/Remote Database Management ที่ถูกพัฒนาโดย SF-based Google subsidiary• Real-time synchronized cloud database
• เป็นตัวที่ได้รับความนิยมและประสบความส าเร็จตัวหนึ่งในปัจจุบัน
คุณสมบัติของ Firebase
• API ในการเข้าถึงข้อมูลได้จาก Android, iOS, Java, JavaScript, Obj-C, Node.js
• REST API ที่มี libraries ส าหรับค าสั่งทั่วไปของ JS frameworks
• ความสามารถในการ sync และ notifications ของข้อมูลที่มีการเปลี่ยนแปลง
• Cloud scaling สามารถรองรับการเข้าใช้งานได้พร้อม ๆ กันหลายคน
• สามารถเป็น web hosting, login/authentication
9
การจัดเก็บข้อมูลของ FIREBASE
มีการเก็บข้อมูลในรูปแบบของ map <key, value> • Value สามารถเป็นได้ทั้ง text, number, boolean, lists หรือ maps
• Object สามารถจัดเก็บในรูปของ map from {field name => value}
• List สามารถจัดเก็บในรูปของ map from {int index => value}
• ฐานข้อมูลมีลักษณะคล้ายกับ tree-like map structure
10
การติดตั้ง FIREBASE HTTPS://FIREBASE.GOOGLE.COM
Create Realtime Database
12
ADD FIREBASE TO ANDROID PROJECT
เลือกที่ Project Overview -> สัญลักษณ์ Android
13
ADD FIREBASE TO ANDROID PROJECT
ระบุชื่อ Package ใน Android Project ลงใน Firebase จากนั้นกดปุ่ม Register App
14
ADD FIREBASE TO ANDROID PROJECT
Download ไฟล์ google-services.json ไปไว้ใน Android Project
15
ADD FIREBASE TO ANDROID PROJECT
Add Firebase SDK ใน Android Project (Project build.gradle)
16
ADD FIREBASE TO ANDROID PROJECT
Add Firebase SDK ใน Android Project (Module App: build.gradle)
17
ADD FIREBASE TO ANDROID PROJECT
เมื่อ sync gradle เรียบร้อยแล้ว กดปุ่ม Continue to console
18
การติดตั้ง FIREBASE
ลงชื่อเข้าใช้งานในเว็บส าหรับ free account ที่ https://www.firebase.comติดต้ัง Firebase ลงใน android studio project’s build.gradle (Module: app)
ก าหนด Permission ใน AndroidManifest.xml
19
dependencies {
…
implementation 'com.google.firebase:firebase-database:19.2.0'
}
android {
…
packagingOptions{
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE-FIREBASE.txt'
exclude 'META-INF/NOTICE'
}
}
<uses-permission android:name="android.permission.INTERNET" />
การเขียนข้อมูลลงใน FIREBASE
ก าหนดการเริ่มต้นใช้งานของ Firebase เพียงครั้งเดียวใน Activity ที่ถูกเรียกใช้เป็นครั้งแรก ในmethod onCreate()
การเขียนข้อมูลลงไปใช้ค าสั่ง fb.child(“key”).setValue(value);
โดยที่ key จะเป็นตัวแทนในการเรียกใช้ข้อมูล (object name)
ส่วน values เป็นได้หลายชนิด เช่น Boolean, Long, Double, List, Map<String, Object>
20
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FirebaseApp.initializeApp(this);
}
ตัวอย่างการสร้าง FIREBASE
21
public void sampleCreateFirebase(){
FirebaseDatabase database =
FirebaseDatabase.getInstance("https://your_url.firebaseio.com/");
DatabaseReference myRef = database.getReference("student");
DatabaseReference stu1 = myRef.child("123");
stu1.child("id").setValue("123");
stu1.child("name").setValue("Sayan");
stu1.child("email").setValue("[email protected]");
}
AUTO GENERATED KEY
ในบางกรณีที่ต้องการให้ Firebase สร้าง Auto ID ส าหรับข้อมูลแต่ละแถวได้ โดยใช้ค าสั่ง push()
ซึ่งช่วยในการที่มีผู้ใช้ต้องการบันทึกข้อมูลพร้อม ๆ กันหลายคน โดยไม่ต้องสนใจเรื่องของ key ที่ต้องสร้างให้
23
DatabaseReference stu1 = myRef.push();
stu1.child("id").setValue("234");
stu1.child("name").setValue("Somchai");
stu1.child("email").setValue("[email protected]");
Log.e("err", stu1.toString());
การจัดเก็บข้อมูลด้วย CLASS
• หากต้องการจัดเก็บคลาสลงใน Firebase จ าเป็นต้องสร้างคลาสที่ไม่มีพารามิเตอร์ในส่วนของ constructor
• ทุก ๆ attributes จ าต้องมี method getAttributeName()
24
public class Student {
private String stuid;
private String stuname;
private String email;
public Student() {
}
…
}
Student stu3 = new Student("345", "Somchai", "[email protected]");
DatabaseReference stu1 = myRef.child(stu3.getId());
stu1.setValue(stu3);
QUERY FIREBASE
ใน Firebase ไม่สามารถใช้ค าสั่ง SQL ได้เหมือนกับ Relational Database ทั่วไป ดังนั้นใน Firebase ได้เตรียมค าสั่งในการ query ข้อมูลโดยใช้ Query object, Ordering, Range และอื่น ๆ
25
FirebaseDatabase database =
FirebaseDatabase.getInstance("https://your_url.firebaseio.com/");
DatabaseReference myRef = database.getReference("student");
// Select * from Student where id = '234';
Query query1 = myRef.orderByKey().equalTo("234");
// Select * from Student where id >= 234;
Query query2 = myRef.orderByKey().startAt("234");
// Select * from Student where name like ‘B%’;
Query query3 = myRef.orderByChild("name").startAt("B").endAt("Bz");
การอ่านค่าจาก DATASNAPSHOT
DataSnapshot เป็น คลาสส าหรับจัดเก็บข้อมูลที่ได้จากการ query โดยในตัวอย่างที่ให้มานี้เป็นการ query ข้อมูลที่มี id ตั้งแต่ 234 เป็นต้นไป
26
FirebaseDatabase database =
FirebaseDatabase.getInstance("https://your_url.firebaseio.com/");
DatabaseReference myRef = database.getReference("student");
Query query1 = myRef.orderByKey().startAt("234");
query1.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()){
Log.d("test", ds.getKey() + " => " + ds.getValue());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
ระบุข้อมูลที่ต้องการ
dataSnapshot
การอ่านค่าจาก DATASNAPSHOT
ผลลัพธ์ที่ได้จาก ds.getKey() => ds.getValue() ได้ดังนี้
27
for (DataSnapshot ds : dataSnapshot.getChildren()){
Log.d("test", ds.getKey() + " => " + ds.getValue());
}
getKey()
getValue()
345 => {name=Somchai, id=345, [email protected]}
-LXXsFenD9CQhsQI8Q-0 => {name=Somchai, id=234, [email protected]}
FirebaseDatabase database =
FirebaseDatabase.getInstance("https://your_url.firebaseio.com/");
DatabaseReference myRef = database.getReference("student/123");
Query query1 = myRef.orderByKey();
query1.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()){
Log.d("test", ds.getKey() + " => " + ds.getValue());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
ตัวอย่างการอ่านค่า
ผู้ใช้สามารถระบุค่าข้อมูลที่ต้องการได้โดยผ่านตัวแปร String ในส่วนของเมธอด fb.child(“….”) เช่น
28
ระบุ root ได้ที่นี่
email => [email protected]
stuid => 123
stuname => Sayan
getKey() getValue()
QUERY METHODS
29
METHOD DESCRIPTION SQL
q.orderByKey()q.orderByChild(“name”)q.orderByValue()q.orderByPriority
เรียงล าดับตาม key ของข้อมูลเรียงล าดับตาม child keyเรียงล าดับตาม value ของข้อมูลเรียงล าดับตามความส าคัญ manually
Order by
q.startAt(value)q.startAt()
เริ่มต้นที่ valueข้อมูลทั้งหมดเรียงล าดับจากน้อยไปหามาก
>=ASC
q.endAt(value)q.endAt()
สิ้นสุดที่ value ข้อมูลทั้งหมดเรียงล าดับจากมากไปหาน้อย
<=DESC
q.limitToFirst(count) ข้อมูล count แถวเริ่มต้น LIMIT count
q.limitToLast(count) ข้อมูล count แถวสุดท้าย
q.equalTo(“value”) ข้อมูลที่ตรงกับ value =
FirebaseDatabase database =
FirebaseDatabase.getInstance("https://your_url.firebaseio.com/");
DatabaseReference myRef = database.getReference("student");
DatabaseReference stu1 = myRef.child("345");
stu1.removeValue();
การ REMOVE ข้อมูล
ในการ Remove ข้อมูลออกจาก Firebase
30
ระบุ root ได้ที่นี่ระบุ key ที่ต้องการลบลบข้อมูล
การก าหนด USER ใน FIREBASE
สามารถไปที่ Firebase website จากนั้นเลือกที่ Authentication แล้วเลือก Sign-in method
31
1) เลือกที่นี่
2) เลือกที่นี่
การก าหนด USER ใน FIREBASE
จากนั้นเลือก Users และกดปุ่ม Add User เพื่อก าหนด Email และ Password
32
DATABASE RULES
ก าหนดการอ่านและเขียนข้อมูลของ Database เป็นตามสิทธิ์ที่ถูกก าหนดให้
33
SECURITY & AUTHENTICATION
โดยทั่วไป user สามารถเข้าถึง Firebase ได้ทั้งอ่านและเขียน• สามารถก าหนดความปลอดภัยของข้อมูลได้ โดยการก าหนด email และ password ส าหรับ
ข้อมูลผ่านทาง website ของ Firebase ได้
• จากนั้นแก้ไขโปรแกรมให้ login ก่อนเสมอถึงจะสามารถเข้าใช้งาน Firebase ได้
34
final FirebaseDatabase database =
FirebaseDatabase.getInstance("https://your_url.firebaseio.com/");
mAuth = FirebaseAuth.getInstance();
mAuth.signInWithEmailAndPassword("[email protected]", “password")
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
FirebaseUser user = mAuth.getCurrentUser();
...
}else{
Log.e("test", "login failed");
}
}
});
private FirebaseAuth mAuth;
เมื่อ login ผ่าน