Sqflite Database Data Update Functionality in List in Flutter

 import "package:flutter/material.dart";

import "package:sqflite/sqflite.dart";
import "package:path/path.dart";

void main() {
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Data Update in List with Sqflite Database",
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.grey,
),
home: const HomeScreen(),
);
}
}

class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});

@override
State<HomeScreen> createState() {
return HomeScreenState();
}
}

class HomeScreenState extends State<HomeScreen> {
TextEditingController controller = TextEditingController();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
Future<Database>? database;

@override
void initState() {
super.initState();
_openDatabase();
}

Future<void> _openDatabase() async {
database = openDatabase(
join(await getDatabasesPath(), "mydb.db"),
onCreate: (db, version) {
return db.execute(
"CREATE TABLE USER1(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT)");
},
version: 1,
);
}

Future<void> insert(String name) async {
final Database? db = await database;
db?.insert(
"USER1",
{
"NAME": name,
},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}

@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
return FocusManager.instance.primaryFocus?.unfocus();
},
child: Scaffold(
appBar: AppBar(
title: const Text(
"Home Screen",
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
centerTitle: true,
backgroundColor: Colors.grey,
),
body: Center(
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(
width: 300.0,
child: TextFormField(
controller: controller,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(11.0),
),
hintText: "Enter the Text",
labelText: "Text",
),
validator: (value) {
if (value!.isEmpty) {
return "Please enter the name";
}
return null;
},
),
),
const SizedBox(height: 40.0),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
insert(controller.text);
controller.clear();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Data Inserted"),
duration: Duration(seconds: 2),
),
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return DisplayData();
},
),
);
}
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.blue,
fixedSize: const Size(200.0, 50.0),
),
child: const Text(
"SAVE",
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
fontSize: 20.0),
),
),
],
),
),
),
),
);
}
}

class DisplayData extends StatefulWidget {
const DisplayData({super.key});

@override
State<DisplayData> createState() {
return DisplayDataState();
}
}

class DisplayDataState extends State<DisplayData> {
Future<List<Map<String, dynamic>>>? userdata;

Future<List<Map<String, dynamic>>> getUserData() async {
final Database database = await openDatabase(
join(await getDatabasesPath(), "mydb.db"),
);
final List<Map<String, dynamic>> maps = await database.query("USER1");
return maps;
}

Future<void> updateData(int userId, String updatedName) async {
final Database database =
await openDatabase(join(await getDatabasesPath()));
await database.update(
"USER1",
{
"NAME": updatedName,
},
where: "ID = ?",
whereArgs: [userId],
);
setState(
() {
userdata = getUserData();
print("Updated data : $userdata");
},
);
}

@override
void initState() {
super.initState();
userdata = getUserData();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(
"Display Data",
style: TextStyle(fontWeight: FontWeight.bold),
),
centerTitle: true,
backgroundColor: Colors.grey,
),
body: FutureBuilder(
future: userdata,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: CircularProgressIndicator(),
);
} else if (snapshot.hasError) {
return Center(
child: Text("Error : ${snapshot.error}"),
);
} else if (!snapshot.hasData || snapshot.data!.isEmpty) {
return const Center(
child: Text("No data available"),
);
} else {
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(snapshot.data![index]["NAME"]),
trailing: IconButton(
icon: const Icon(Icons.edit),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UpdateData(
userId: snapshot.data![index]["ID"],
currentName: snapshot.data![index]["NAME"],
onDataUpdated: () {
setState(() {
userdata = getUserData();
},);
},
);
},
),
);
},
),
);
},
);
}
},
),
);
}
}

class UpdateData extends StatefulWidget {
const UpdateData(
{super.key,
required this.userId,
required this.currentName,
required this.onDataUpdated});

final int userId;
final String currentName;
final Function() onDataUpdated;

@override
State<UpdateData> createState() {
return UpdateDataState();
}
}

class UpdateDataState extends State<UpdateData> {

TextEditingController updateController = TextEditingController();
Future<Database>? database;

@override
void initState()
{
super.initState();
initializeDatabase();
updateController.text = widget.currentName;
}

void initializeDatabase() async {
final dbPath = await getDatabasesPath();
final path = join(dbPath, "mydb.db");
database = openDatabase(
path,
onCreate: (db, version) {
return db.execute("CREATE TABLE USER1(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT)");
},
version: 1,
);
}

@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
return FocusManager.instance.primaryFocus?.unfocus();
},
child: Scaffold(
appBar: AppBar(
title: const Text("Update data",
style: TextStyle(fontWeight: FontWeight.bold),
),
centerTitle: true,
backgroundColor: Colors.grey,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(
width: 300.0,
child: TextFormField(
controller: updateController,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(11.0),
),
),
validator: (value) {
if(value!.isEmpty)
{
return "Please enter text";
}
return null;
},
),
),
const SizedBox(height: 40.0),
ElevatedButton(
onPressed: () async {
await updateData(widget.userId, updateController.text);
widget.onDataUpdated();
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("Data updated"),
duration: Duration(seconds: 2),
),
);
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.blue,
fixedSize: const Size(200.0, 50.0),
),
child: const Text("UPDATE",
style: TextStyle(fontWeight: FontWeight.bold, color: Colors.white, fontSize: 20.0),
),
),
],
),
),
),
);
}

Future<void> updateData(int userId, String updatedName) async {
final db = await database;
await db?.update(
"USER1",
{
"NAME" : updatedName,
},
where: "ID = ?",
whereArgs: [userId],
);
print("Data updated");
widget.onDataUpdated;
}

}

Comments

Popular posts from this blog

Pagination with Bloc Pattern in Flutter

Pagination First Practical in Flutter

ExpansionPanel with ExpansionPanelList with Complete Collapse Operation in Flutter