เอกสารประกอบการสอน 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


