เอกสารประกอบการสอน 4123006 การพัฒนาโปรแกรมประยุกต์บนอุปกรณ์เคลื่อน Week 5 [Autosaved]
1. เปิด android studio แล้ว new flutter project ตั้งชื่อ appweek5_sqflite
2.พอเปิด project appweek5_sqflite ใน android studio ให้ไปแก้ไฟล์ pubspec.yaml เพิ่ม
sqflite: ^1.3.2+2
path_provider: ^1.6.27
dependencies: flutter: sdk: flutter sqflite: ^1.3.2+2 path_provider: ^1.6.27
สามารถเข้าไปค้นหาเวอรชั่นของ package ของ plugin ที่ https://pub.dev/packages/sqflite/install (เช่นของ sqflite)
3. ให้ไปคลิกขวาที่ folder lib แล้วเลือก new แล้วเลือก package แล้วพิมพ์ database เพื่อสร้าง folder package database
4.คลิกขวาที่ Folder database แล้วเลือก new แล้ว เลือก dart file แล้วตั้งชื่อ database_helper
5. เปิดไฟล์ database_helper.dart แล้วแก้ไขโค้ดตามนี้
import 'dart:io'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path_provider/path_provider.dart'; class DatabaseHelper{ static final _databaseName="MyDb.db"; static final _databaseVersion=1; static final table='my_table'; static final columnId='_id'; static final columnName='name'; static final columnAge='age'; // สร้าง instant สำหรับเรียกใช้ db ก่อน DatabaseHelper._privateConstructor(); static final DatabaseHelper instance=DatabaseHelper._privateConstructor(); //สร้าง การเชื่อมต่อ db ของตนเอง static Database _database; Future<Database> get database async{ if(_database!=null) return _database; _database=await _initDatabase(); return _database; } //ทำการเปิด db แล้ว ตรวจว่ามีหรือยัง ถ้าไม่มีให้สร้าง db _initDatabase() async{ Directory documentsDirectory=await getApplicationDocumentsDirectory(); String path=join(documentsDirectory.path,_databaseName); return await openDatabase(path, version: _databaseVersion, onCreate: _onCreate); } // สร้าง table ใน db Future _onCreate(Database db,int version) async{ await db.execute(''' CREATE TABLE $table( $columnId INTEGER PRIMARY KEY, $columnName TEXT NOT NULL, $columnAge TEXT NOT NULL ) '''); } // บันทึกลงบนฐานข้อมูล Future<int> insert(Map<String,dynamic>row) async{ Database db=await instance.database; return await db.insert(table, row); } //ดึงข้อมูลแล้วนับจำนวน Row Count กลับไปว่ามีข้อมูลกี่ row Future<int> queryRowCount() async{ Database db=await instance.database; return Sqflite.firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM $table')); } //ดึงข้อมูลแบบหลาย Row Future<List<Map<String,dynamic>>> queryAllRow() async{ Database db=await instance.database; return await db.query(table); } //บันทึกข้อมูลลงฐานข้อมูล Future<int> update(Map<String,dynamic>row) async{ Database db=await instance.database; int id=row[columnId]; return await db.update(table, row,where: '$columnId= ?',whereArgs: [id]); } //ลบข้อมูลจากฐานข้อมูล Future<int> delete(int id) async{ Database db=await instance.database; return await db.delete(table, where: '$columnId= ?',whereArgs: [id]); } }
6. กลับมาหน้า main.dart เพิ่มปุ่มกด แล้วเขียนโค้ดเพื่อสั่งงาน db
import 'package:appweek5_sqflite/database/database_helper.dart'; import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); @override final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { TextEditingController txtID=TextEditingController(); TextEditingController txtName=TextEditingController(); TextEditingController txtAge=TextEditingController(); int _counter = 0; //ประกาศคัวแปร dbHelper final dbHelper=DatabaseHelper.instance; int TotalCount=0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { //กรณีที่ต้องการให้แอพโหลดดาต้าตอนเปิด แต่อาจจะโหลดซ้ำเรื่อยๆ เพราะมันติด async //_query(); return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ TextField( keyboardType: TextInputType.number, controller: txtID, ), TextField( controller: txtName, ), TextField( controller: txtAge, ), Text("มีข้อมูลใน Table ทั้งหมด : $TotalCount"), RaisedButton( onPressed: (){ _insert(); }, child:Text('Insert'), ), RaisedButton( onPressed: (){ _query(); }, child:Text('Get Rowcount'), ) , RaisedButton( onPressed: (){ _queryAll(); }, child:Text('Get all Rows'), ) , RaisedButton( onPressed: (){ _update(); }, child:Text('Update Data'), ) , RaisedButton( onPressed: (){ _delete(); }, child:Text('DELETE Data'), ) ], ), ), ); } //คำสั่ง Insert ข้อมูล void _insert() async{ //row insert Map<String,dynamic>row={ DatabaseHelper.columnName : 'sompoch kulthararom', DatabaseHelper.columnAge : '30' }; //ประกาศคัวแปร dbHelper ด้านบน ... extend State<.... final id=await dbHelper.insert(row); // คำสั่งเต็มจริงๆ insert into table(filed1,filed2...)VALUES(value1,value2..) print('บันทึกแล้วโดยมี id = $id'); } //เรียกดูข้อมูลใน table ว่ามีกี่ row void _query() async{ final int totalrow=await dbHelper.queryRowCount(); TotalCount=totalrow; print("มีข้อมูลทั้งหมดใน table = $totalrow row"); reloaddata(); } void _queryAll() async{ final allRows=await dbHelper.queryAllRow(); print("มีข้อมูลทั้งหมดใน table"); allRows.forEach((row)=>print(row)); reloaddata(); } void _update() async{ Map<String,dynamic> row={ DatabaseHelper.columnId:int.parse(txtID.text), DatabaseHelper.columnName:txtName.text, DatabaseHelper.columnAge:txtAge.text }; final rowsAffected=await dbHelper.update(row); print('บันทึกเรียบร้อย id = $rowsAffected'); } void _delete() async{ final rowsDeleted=await dbHelper.delete(int.parse(txtID.text)); print('deleted'); } void reloaddata(){ setState(() { }); } } //extend state