database and sql sayan unankard 7 - maejo universityitsci.mju.ac.th/sayan/it411/slides/it411_07...
TRANSCRIPT
www . i t s c i .m ju . ac . t h / sayan
DATABASE AND SQL SAYAN UNANKARD
7
DATABASE คืออะไร?
Relational Database = ข้อมูลที่จัดเก็บอยู่ในฐานข้อมูลที่มีโครงสร้างข้อมูลในแบบเชิงสัมพันธ์ จะถูกแยกจัดเก็บออกเป็นหน่วยย่อย ๆ ที่เรียกว่ารีเลชัน (Relation) หรือโดยทั่วไปเรียกว่าตารางแบบ 2 มิติ (two-dimensional table) ข้อมูลจะถูกเก็บในรูปแบบของตาราง ซึ่งภายในตารางจะแบ่งออกเป็น แถว และคอลัมน์
2
ข้อมูลอยู่ที่ไหนบน ANDROID?
ระบบฐานข้อมูลสามารถถูกจัดเก็บได้หลายที่ ขึ้นอยู่กับขนาดของฐานข้อมูล• ภายในเครื่องมือถือ Android เรียกว่า local database
• บน remote web server เครื่องเดียว
• กระจายอยู่บน remote web server หลายๆ ตัว หรือ บน cloud
3
SQL DATABASES IN ANDROID
โดยทั่วไป Android จะใช้ระบบฐานข้อมูลที่ถูกฝังมากับระบบปฏิบัติการเรียกว่า SQLite ซึ่งสามารถใช้งานได้หลากหลายค าสั่ง ได้แก่ • create a database
• define SQL tables
• Indices
• Queries
• Views
• Triggers
• Insert/Delete/Update rows
• administer a SQLite database file
4
USING SQLITE
• SQLite พัฒนามาจากมาตรฐาน SQL-92 standard
• สนับสนุนการท างานของ triggers บางส่วน และ สามารถท า complex queries (ยกเว้นouter joins)
• SQLITE ไม่ได้พัฒนาในส่วนของ referential integrity constraints ผ่านตัว foreign key constraint model
• SQLite เป็น relaxed data typing model คือ ไม่ได้เป็นการก าหนดชนิดของข้อมูลส าหรับแต่ละคอลัมน์ แต่เป็นชนิดข้อมูลส าหรับค่าแต่ละค่า ดังนั้นมีโอกาสที่จะป้อนข้อมูล String ในคอลัมน์ที่เป็นตัวเลขได้
• Documentation on SQLITE available at http://www.sqlite.org/docs.html
5
HOW TO USE A SQLITE DATABASE?
6
STORAGE CLASSES AND DATATYPES
แต่ละค่าจะถูกจัดเก็บตามรูปแบบคลาสดังนี้• NULL จัดเก็บค่า NULL
• INTEGER จัดเก็บค่าตัวเลขจ านวนเต็ม จ านวน 1, 2, 3, 4, 6, หรือ 8 bytes ขึ้นอยู่กับค่าตัวเลข
• REAL จัดเก็บค่าตัวเลขทศนิยม จ านวน 8-byte IEEE floating point number
• TEXT จัดเก็บข้อความ string โดยมีการเข้ารหัส database encoding (UTF-8, UTF-16BE หรือ UTF-16LE)
• BLOB จัดเก็บข้อมูลแบบ Binary Large Object
7
CREATE SQLite DATABASE
สร้าง DatabaseHelper Class ส าหรับสร้างฐานข้อมูล โดยสืบทอดคุณสมบัติมาจากคลาส SQLiteOpenHelper จะต้อง implements constructor และ เมธอด onCreate() และ onUpgrade()
8
package com.example.sayan.lec8;
...
public class DatabaseHelper extends SQLiteOpenHelper {
private static String DB_NAME = "it411db";
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "Create Table IF NOT EXISTS Student (StuID TEXT PRIMARY KEY,
StuName TEXT, Email TEXT)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("Drop Table if exists Student");
this.onCreate(db);
}
}
สร้างตาราง Student ในฐานข้อมูล it411db
ลบตาราง Student ออกจากฐานข้อมูล it411db
การเรียกใช้ คลาส DatabaseHelper
การเรียกใช้ สามารถเรียกใช้ใน MainActivity ในเมธอด onCreate()
9
public class MainActivity extends AppCompatActivity {
private DatabaseHelper myDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDB = new DatabaseHelper(this);
}
}
new object ของ DatabaseHelper
INSERT RECORD
ในส่วนของการเพิ่มข้อมูลเข้าสู่ฐานข้อมูล สามารถเรียกใช้ค าสั่ง insert(ชื่อตาราง, Null คอลัมน,์ ค่าที่ต้องการเพิ่ม)
10
public boolean addStudent(Student student) {
long result = -1;
try {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("StuID", student.getStuID());
values.put("StuName", student.getStuName());
values.put("Email", student.getEmail());
// Inserting Row
result = db.insert("Student", null, values);
db.close(); // Closing database connection
}catch (Exception ex) {
ex.printStackTrace();
}
if (result == -1) {
return false;
}else{
return true;
}
}
ก าหนดให้บันทึกข้อมูลได้
ระบุค่าที่ต้องการเพิ่มใน ContentValues
เรียกใช้ค าสั่ง insert
boolean result = myDB.addStudent(new Student("560001", "Sayan", "[email protected]"));
การเรียกใช้งาน
public boolean updateStudent(Student student) {
long result = -1;
try {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("StuID", student.getStuID());
values.put("StuName", student.getStuName());
values.put("Email", student.getEmail());
// Updating Row
result = db.update("Student", values, "StuID = ?",
new String[] {student.getStuID()});
db.close(); // Closing database connection
}catch (Exception ex) {
ex.printStackTrace();
}
if (result == -1) {
return false;
}else{
return true;
}
}
UPDATE RECORD
ในส่วนของการแก้ไขข้อมูล สามารถเรียกใช้ค าสั่ง update(ชื่อตาราง, ค่าที่ต้องการแก้ไข, ค าสั่ง where, พารามิเตอร์ที่ระบุใน where)
11
เรียกใช้ค าสั่ง update
boolean result = myDB.updateStudent(new Student("560001", "Sayan", "[email protected]"));
การเรียกใช้งาน
ในส่วนของการลบข้อมูล สามารถเรียกใช้ค าสั่ง delete(ชื่อตาราง, ค าสั่ง where, พารามิเตอร์ที่ระบุใน where)
DELETE RECORD
12
public boolean deleteStudents(String stuid) {
long result = -1;
try {
SQLiteDatabase db = this.getWritableDatabase();
// Deleting Row
result = db.delete("Student", "StuID = ?", new String[] {stuid});
db.close(); // Closing database connection
}catch (Exception ex) {
ex.printStackTrace();
}
if (result == -1) {
return false;
}else{
return true;
}
}
เรียกใช้ค าสั่ง delete
boolean result = myDB.deleteStudent("560001");
การเรียกใช้งาน
ในส่วนของการอ่านข้อมูล สามารถเรียกใช้ค าสั่ง rawQuery(ค าสั่ง sql, พารามิเตอร์ส าหรับค าสั่ง where) โดยตัวที่น ามารับค่าคือตัวแปร Cursor โดยสามารถใช้ค าสั่ง moveToFirst เพื่อเลื่อนต าแหน่งของ cursor ไปข้อมูลแถวแรกได้
SELECT RECORD
13
public Student getStudent(String stuid) {
Student stu = new Student();
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery("Select StuID, StuName, Email from Student
Where Stuid = ?", new String[] {stuid});
if (cursor != null) {
cursor.moveToFirst();
stu = new Student(cursor.getString(0),cursor.getString(1),
cursor.getString(2));
}
db.close();
return stu;
}
เรียกใช้ค าสั่ง rawQuery
Student stu = myDB.getStudent("560001");
การเรียกใช้งาน
public List<Student> getStudents() {
List<Student> list = new ArrayList<Student>();
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery("Select StuID, StuName, Email from Student", null);
if (cursor != null) {
cursor.moveToFirst();
do {
Student stu = new Student(cursor.getString(0), cursor.getString(1),
cursor.getString(2));
list.add(stu);
}while (cursor.moveToNext());
}
db.close();
return list;
}
ในส่วนของการอ่านข้อมูลหลายแถว สามารถเรียกใช้ค าสั่ง rawQuery(ค าสั่ง sql, พารามิเตอร์ส าหรับค าสั่ง where) โดยตัวที่น ามารับค่าคือตัวแปร Cursor โดยสามารถใช้ค าสั่ง moveToFirst(), moveToNext() เพื่อเลื่อนต าแหน่งของ cursor ได้
SELECT MULTIPLE RECORDS
14
เรียกใช้ค าสั่ง rawQuery
ใช้ค าสั่ง do…while ในการหมุน loop cursor
List<Student> list = myDB.getStudents();
การเรียกใช้งาน
WHERE IS MY SQLite DATABASE STORED?
เมื่อรันโปรแกรม เราสามารถดูว่าฐานข้อมูลของเราสร้างไว้ที่ไหน โดยเลือกที่ View -> Tool Windows -> Device File Explorer ฐานข้อมูลของ app ที่เราสร้างจะอยู่ใน data -> data -> ชื่อ app -> databases
15
DB BROWSER FOR SQLITE
https://sqlitebrowser.org/
16
SQLite MANAGER ADD-ON FOR FIREFOX
สามารถติดตั้ง SQLite Manager Add-on ส าหรับ Firefox เพื่อดูตารางและข้อมูลในฐานข้อมูลได้
17