рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ SQLite рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рд╣рдо рдЖрдкрдХреЗ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ "рдлреНрд▓рдЯрд░ рдореЗрдВ SQLite рдХрд╛ рдЙрдкрдпреЛрдЧ" ред



рдбреЗрдЯрд╛ рд╕рд╣реЗрдЬрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдорд╛рди рдбреЗрдЯрд╛ рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдмрдЪрд╛рдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреАред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдлреНрд▓рдЯрд░-рдИ рдореЗрдВ SQLite рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ

SQLite рдХреНрдпреЛрдВ?


SQLite рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо SQLite рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП sqflite рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред Sqflite SQLite рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдлрд╝реНрд▓рдЯрд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

1. рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ


рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, pubspec.yaml рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВред рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рддрд╣рдд, sqflite рдФрд░ path_provider рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝реЗрдВред

dependencies: flutter: sdk: flutter sqflite: any path_provider: any 

2. DB рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдПрдВ


рдЕрдм рдПрдХ рдирдпрд╛ Database.dart рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рдЗрд╕рдореЗрдВ, рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдмрдирд╛рдПрдВред

рд╣рдореЗрдВ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ: рд╣рдо рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЧ рдЗрдХрд╛рдИ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПред

1. рдПрдХ рдирд┐рдЬреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 class DBProvider { DBProvider._(); static final DBProvider db = DBProvider._(); } 

2. рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрдЯ рдХрд░реЗрдВ

рдЕрдЧрд▓рд╛ рдХрджрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реИ рдФрд░ рдПрдХ рдЧреЗрдЯреНрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВрдЧреЗ рдпрджрд┐ рдпрд╣ рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЖрд▓рд╕реАрдХрд░рдг)

 static Database _database; Future<Database> get database async { if (_database != null) return _database; // if _database is null we instantiate it _database = await initDB(); return _database; } 

рдпрджрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП initDB рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХрд╛ рдорд╛рд░реНрдЧ рдорд┐рд▓рддрд╛ рд╣реИ

 initDB() async { Directory documentsDirectory = await getApplicationDocumentsDirectory(); String path = join(documentsDirectory.path, "TestDB.db"); return await openDatabase(path, version: 1, onOpen: (db) { }, onCreate: (Database db, int version) async { await db.execute("CREATE TABLE Client (" "id INTEGER PRIMARY KEY," "first_name TEXT," "last_name TEXT," "blocked BIT" ")"); }); } 

3. рдПрдХ рдореЙрдбрд▓ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ


рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рдХреЛ рдбрд╛рд░реНрдЯ рдореИрдк рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдореЗрдВ toMap рдФрд░ fromMap рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореЙрдбрд▓ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рд╕рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ

рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓:

 /// ClientModel.dart import 'dart:convert'; Client clientFromJson(String str) { final jsonData = json.decode(str); return Client.fromJson(jsonData); } String clientToJson(Client data) { final dyn = data.toJson(); return json.encode(dyn); } class Client { int id; String firstName; String lastName; bool blocked; Client({ this.id, this.firstName, this.lastName, this.blocked, }); factory Client.fromJson(Map<String, dynamic> json) => new Client( id: json["id"], firstName: json["first_name"], lastName: json["last_name"], blocked: json["blocked"], ); Map<String, dynamic> toJson() => { "id": id, "first_name": firstName, "last_name": lastName, "blocked": blocked, }; } 

4. CRUD рдСрдкрд░реЗрд╢рди


рдмрдирд╛рдПрдВ

рдХрдЪреНрдЪреА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

 newClient(Client newClient) async { final db = await database; var res = await db.rawInsert( "INSERT Into Client (id,first_name)" " VALUES (${newClient.id},${newClient.firstName})"); return res; } 

рдбрд╛рд▓рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ:

 newClient(Client newClient) async { final db = await database; var res = await db.insert("Client", newClient.toMap()); return res; } 

рдПрдХ рдирдИ рдЖрдИрдбреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг

 newClient(Client newClient) async { final db = await database; //get the biggest id in the table var table = await db.rawQuery("SELECT MAX(id)+1 as id FROM Client"); int id = table.first["id"]; //insert to the table using the new id var raw = await db.rawInsert( "INSERT Into Client (id,first_name,last_name,blocked)" " VALUES (?,?,?,?)", [id, newClient.firstName, newClient.lastName, newClient.blocked]); return raw; } 

рдкрдврд╝реЗрдВ

рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

 getClient(int id) async { final db = await database; var res =await db.query("Client", where: "id = ?", whereArgs: [id]); return res.isNotEmpty ? Client.fromMap(res.first) : Null ; } 

рдПрдХ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рд╕рднреА рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

 getAllClients() async { final db = await database; var res = await db.query("Client"); List<Client> list = res.isNotEmpty ? res.map((c) => Client.fromMap(c)).toList() : []; return list; } 

рдХреЗрд╡рд▓ рдЕрд╡рд░реБрджреНрдз рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

 getBlockedClients() async { final db = await database; var res = await db.rawQuery("SELECT * FROM Client WHERE blocked=1"); List<Client> list = res.isNotEmpty ? res.toList().map((c) => Client.fromMap(c)) : null; return list; } 

рдЕрджреНрдпрддрди

рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ

 updateClient(Client newClient) async { final db = await database; var res = await db.update("Client", newClient.toMap(), where: "id = ?", whereArgs: [newClient.id]); return res; } 

рдХреНрд▓рд╛рдЗрдВрдЯ рд▓реЙрдХ / рдЕрдирд▓реЙрдХ

 blockOrUnblock(Client client) async { final db = await database; Client blocked = Client( id: client.id, firstName: client.firstName, lastName: client.lastName, blocked: !client.blocked); var res = await db.update("Client", blocked.toMap(), where: "id = ?", whereArgs: [client.id]); return res; } 

рд╣рдЯрд╛рдПрдВ

рдПрдХ рдЧреНрд░рд╛рд╣рдХ рд╣рдЯрд╛рдПрдВ

 deleteClient(int id) async { final db = await database; db.delete("Client", where: "id = ?", whereArgs: [id]); } 

рд╕рднреА рдЧреНрд░рд╛рд╣рдХ рд╣рдЯрд╛рдПрдВ

 deleteAll() async { final db = await database; db.rawDelete("Delete * from Client"); } 

рдбреЗрдореЛ



рд╣рдорд╛рд░реЗ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рд╣рдо рд╕реНрдХреНрд░реАрди рдмрдирд╛рддреЗ рд╣реИрдВ

 Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("Flutter SQLite")), body: FutureBuilder<List<Client>>( future: DBProvider.db.getAllClients(), builder: (BuildContext context, AsyncSnapshot<List<Client>> snapshot) { if (snapshot.hasData) { return ListView.builder( itemCount: snapshot.data.length, itemBuilder: (BuildContext context, int index) { Client item = snapshot.data[index]; return ListTile( title: Text(item.lastName), leading: Text(item.id.toString()), trailing: Checkbox( onChanged: (bool value) { DBProvider.db.blockClient(item); setState(() {}); }, value: item.blocked, ), ); }, ); } else { return Center(child: CircularProgressIndicator()); } }, ), floatingActionButton: FloatingActionButton( child: Icon(Icons.add), onPressed: () async { Client rnd = testClients[math.Random().nextInt(testClients.length)]; await DBProvider.db.newClient(rnd); setState(() {}); }, ), ); } 

рдиреЛрдЯ:

1. FutureBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

2. рдкрд░реАрдХреНрд╖рдг рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FAB

 List<Client> testClients = [ Client(firstName: "Raouf", lastName: "Rahiche", blocked: false), Client(firstName: "Zaki", lastName: "oun", blocked: true), Client(firstName: "oussama", lastName: "ali", blocked: false), ]; 

3. рдЬрдм рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ CircularProgressIndicator рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

4. рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪреЗрдХрдмреЙрдХреНрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрд╡рд░реБрджреНрдз / рдЕрдирд▓реЙрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдЕрдм рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдкрд░ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рд▓рд┐рд╕реНрдЯрдЯрд╛рдЗрд▓ рдХреЛ рдЗрд╕ рддрд░рд╣ рдбрд┐рд╕рдорд┐рд╕рд┐рд╡ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ:

 return Dismissible( key: UniqueKey(), background: Container(color: Colors.red), onDismissed: (direction) { DBProvider.db.deleteClient(item.id); }, child: ListTile(...), ); 


рдПрдХ рдмреАрдПрд▓рдУрд╕реА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ


рд╣рдордиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдпреВрдЖрдИ рдкрд░рдд рдореЗрдВ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдпреВрдЖрдИ рд╕реЗ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВред

рд╕реНрдкрдВрджрди рдореЗрдВ рдХрдИ рдкреИрдЯрд░реНрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо BLoC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИред

рдмреАрдПрд▓рдУрд╕реА рдмрдирд╛рдПрдВ

 class ClientsBloc { ClientsBloc() { getClients(); } final _clientController = StreamController<List<Client>>.broadcast(); get clients => _clientController.stream; dispose() { _clientController.close(); } getClients() async { _clientController.sink.add(await DBProvider.db.getAllClients()); } } 

рдиреЛрдЯ:
рдиреЛрдЯреНрд╕:

1. getClients рдбреЗрдЯрд╛рдмреЗрд╕ (рдХреНрд▓рд╛рдЗрдВрдЯ рдЯреЗрдмрд▓) рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рднреА рд╣рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд░рдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИред

2. рд╣рдордиреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкреНрд░рд╕рд╛рд░рдг рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП StreamController.broadcast рдмрдирд╛рдпрд╛ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдмрд╛рд░ рд╕реБрдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

3. рдзрд╛рдЧреЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред рдЗрд╕ рддрд░рд╣ рд╣рдо рд╕реНрдорд╛рд░рдХ рд░реЛрдХреЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд╕реНрдЯреЗрдЯрдлреБрд▓рд╡реЗрдЯ рдореЗрдВ рдбрд┐рд╕реНрдкреЛрдЬрд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ

рдЕрдм рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ

 blockUnblock(Client client) { DBProvider.db.blockOrUnblock(client); getClients(); } delete(int id) { DBProvider.db.deleteClient(id); getClients(); } add(Client client) { DBProvider.db.newClient(client); getClients(); } 

рдФрд░ рдЕрдВрдд рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо


рд╕реВрддреНрд░ рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ - рдЬреАрдереВрдм

Source: https://habr.com/ru/post/hi435418/


All Articles