BACKEND AS A SERVICE - Information Technology Firebase.pdf · •...

Preview:

Citation preview

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

11

การติดตั้ง 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("sayan@mju.ac.th");

}

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("somchai@gmail.com");

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", "somchai@mju.ac.th");

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=somchai@mju.ac.th}

-LXXsFenD9CQhsQI8Q-0 => {name=Somchai, id=234, email=somchai@gmail.com}

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 => sayan@mju.ac.th

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("rsayan@gmail.com", “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 ผ่าน

Recommended