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

Second GET API Calling with Bloc simple Example in Flutter

Stack Container Scrollable Card widget UI with Custom Widget

Pagination with Bloc Pattern in Flutter