Skip to content

Commit 5b338cd

Browse files
committed
add code
1 parent e5a833e commit 5b338cd

18 files changed

+1279
-141
lines changed

lib/app.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_bloc_pattern/flutter_bloc_pattern.dart';
3+
import 'package:flutter_provider/flutter_provider.dart';
4+
import 'package:sqlite_bloc_rxdart/domain/contact_repository.dart';
5+
import 'package:sqlite_bloc_rxdart/pages/home/home_bloc.dart';
6+
import 'package:sqlite_bloc_rxdart/pages/home/home_page.dart';
7+
8+
class MyApp extends StatelessWidget {
9+
const MyApp({Key key}) : super(key: key);
10+
11+
@override
12+
Widget build(BuildContext context) {
13+
return MaterialApp(
14+
title: 'Sqlite BLoC RxDart ',
15+
theme: ThemeData(
16+
primarySwatch: Colors.yellow,
17+
accentColor: Colors.redAccent,
18+
),
19+
home: BlocProvider<HomeBloc>(
20+
child: const HomePage(),
21+
initBloc: () => HomeBloc(Provider.of<ContactRepository>(context)),
22+
),
23+
);
24+
}
25+
}

lib/data/app_database.dart

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'package:path/path.dart';
2+
import 'package:sqflite/sqflite.dart';
3+
import 'package:path_provider/path_provider.dart';
4+
import 'package:sqlbrite/sqlbrite.dart';
5+
import 'package:sqlite_bloc_rxdart/data/contact_dao.dart';
6+
import 'package:sqlite_bloc_rxdart/data/contact_dao_impl.dart';
7+
import 'package:sqlite_bloc_rxdart/data/contact_entity.dart';
8+
import 'package:sqlite_bloc_rxdart/data/contact_entry.dart';
9+
10+
const dbName = 'flutter_sqlite_bloc_rxdart.db';
11+
12+
class AppDatabase {
13+
static Database _db;
14+
static Future<Database> get _dbFuture async => _db ??= await _open();
15+
16+
final ContactDao contactDao;
17+
18+
AppDatabase()
19+
: contactDao = ContactDaoImpl(_dbFuture.then((db) => BriteDatabase(db)));
20+
21+
static Future<Database> _open() async {
22+
final directory = await getApplicationDocumentsDirectory();
23+
String path = join(directory.path, dbName);
24+
return await openDatabase(
25+
path,
26+
version: 1,
27+
onCreate: (Database db, int version) async {
28+
await db.execute('''
29+
CREATE TABLE $tableContacts(
30+
$columnId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
31+
$columnName TEXT NOT NULL,
32+
$columnPhone TEXT NOT NULL,
33+
$columnAddress TEXT NOT NULL,
34+
$columnMale INTEGER NOT NULL DEFAULT 0,
35+
$columnCreatedAt TEXT NOT NULL,
36+
$columnUpdatedAt TEXT NOT NULL
37+
)''');
38+
39+
final batch = db.batch();
40+
for (int i = 0; i < 200; i++) {
41+
batch.insert(
42+
tableContacts,
43+
ContactEntity(
44+
address: 'Address $i',
45+
createdAt: DateTime.now(),
46+
id: null,
47+
male: i % 2 == 0,
48+
name: 'Name $i',
49+
phone: 'Phone $i',
50+
updatedAt: DateTime.now(),
51+
).toJson(),
52+
);
53+
}
54+
await batch.commit(
55+
continueOnError: true,
56+
noResult: true,
57+
);
58+
},
59+
);
60+
}
61+
}

lib/data/contact_dao.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'package:rxdart/rxdart.dart';
2+
import 'package:sqlite_bloc_rxdart/data/contact_entity.dart';
3+
4+
abstract class ContactDao {
5+
Observable<List<ContactEntity>> search(String query);
6+
7+
Observable<ContactEntity> findById(int id);
8+
}

lib/data/contact_dao_impl.dart

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import 'package:rxdart/rxdart.dart';
2+
import 'package:sqlite_bloc_rxdart/data/contact_dao.dart';
3+
import 'package:sqlite_bloc_rxdart/data/contact_entry.dart';
4+
import 'package:sqlbrite/sqlbrite.dart';
5+
6+
import 'contact_entity.dart';
7+
8+
class ContactDaoImpl implements ContactDao {
9+
final Future<BriteDatabase> _briteDatabaseFuture;
10+
11+
const ContactDaoImpl(this._briteDatabaseFuture);
12+
13+
@override
14+
Observable<List<ContactEntity>> search(String query) {
15+
return Observable.fromFuture(_briteDatabaseFuture).flatMap((db) {
16+
return db
17+
.createQuery(
18+
tableContacts,
19+
where:
20+
'$columnName LIKE ? OR $columnAddress LIKE ? OR $columnPhone LIKE ?',
21+
whereArgs: [
22+
'%$query%',
23+
'%$query%',
24+
'%$query%',
25+
],
26+
orderBy: '$columnName ASC',
27+
)
28+
.mapToList((row) => ContactEntity.fromJson(row));
29+
});
30+
}
31+
32+
@override
33+
Observable<ContactEntity> findById(int id) {
34+
return Observable.fromFuture(_briteDatabaseFuture).flatMap((db) {
35+
return db
36+
.createQuery(
37+
tableContacts,
38+
where: '$columnId = ?',
39+
whereArgs: [id],
40+
limit: 1,
41+
)
42+
.mapToOne((row) => ContactEntity.fromJson(row));
43+
});
44+
}
45+
}

lib/data/contact_entity.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import 'package:flutter/widgets.dart';
2+
import 'package:sqlite_bloc_rxdart/data/contact_entry.dart';
3+
4+
class ContactEntity {
5+
final int id;
6+
final String name;
7+
final String phone;
8+
final String address;
9+
final bool male;
10+
final DateTime updatedAt;
11+
final DateTime createdAt;
12+
13+
const ContactEntity({
14+
@required this.id,
15+
@required this.name,
16+
@required this.phone,
17+
@required this.address,
18+
@required this.male,
19+
@required this.updatedAt,
20+
@required this.createdAt,
21+
});
22+
23+
factory ContactEntity.fromJson(Map<String, dynamic> json) {
24+
return ContactEntity(
25+
address: json[columnAddress],
26+
createdAt: DateTime.parse(json[columnCreatedAt]),
27+
id: json[columnId],
28+
male: json[columnMale] == 1,
29+
name: json[columnName],
30+
phone: json[columnPhone],
31+
updatedAt: DateTime.parse(json[columnUpdatedAt]),
32+
);
33+
}
34+
35+
Map<String, dynamic> toJson() {
36+
return <String, dynamic>{
37+
columnId: id,
38+
columnAddress: address,
39+
columnName: name,
40+
columnPhone: phone,
41+
columnMale: male ? 1 : 0,
42+
columnUpdatedAt: updatedAt.toIso8601String(),
43+
columnCreatedAt: createdAt.toIso8601String(),
44+
};
45+
}
46+
}

lib/data/contact_entry.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const tableContacts = 'contacts';
2+
const columnId = '_id';
3+
const columnName = 'name';
4+
const columnPhone = 'phone';
5+
const columnAddress = 'address';
6+
const columnMale = 'male';
7+
const columnCreatedAt = 'created_at';
8+
const columnUpdatedAt = 'updated_at';
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import 'package:rxdart/rxdart.dart';
2+
import 'package:sqlite_bloc_rxdart/data/contact_dao.dart';
3+
import 'package:sqlite_bloc_rxdart/data/contact_entity.dart';
4+
import 'package:sqlite_bloc_rxdart/domain/contact.dart';
5+
import 'package:sqlite_bloc_rxdart/domain/contact_repository.dart';
6+
7+
class ContactRepositoryImpl implements ContactRepository {
8+
final ContactDao _contactDao;
9+
10+
const ContactRepositoryImpl(this._contactDao);
11+
12+
@override
13+
Observable<List<Contact>> search({String query = ''}) {
14+
return _contactDao.search(query).map((entites) {
15+
return entites.map(_toContact).toList(growable: false);
16+
});
17+
}
18+
19+
@override
20+
Observable<Contact> getContactById(int id) {
21+
return _contactDao.findById(id).map(_toContact);
22+
}
23+
}
24+
25+
Contact _toContact(ContactEntity entity) {
26+
return Contact((b) => b
27+
..id = entity.id
28+
..name = entity.name
29+
..phone = entity.phone
30+
..address = entity.address
31+
..male = entity.male
32+
..createdAt = entity.createdAt
33+
..updatedAt = entity.updatedAt);
34+
}

lib/domain/contact.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'package:built_value/built_value.dart';
2+
3+
part 'contact.g.dart';
4+
5+
abstract class Contact implements Built<Contact, ContactBuilder> {
6+
int get id;
7+
String get name;
8+
String get phone;
9+
String get address;
10+
bool get male;
11+
DateTime get updatedAt;
12+
DateTime get createdAt;
13+
14+
Contact._();
15+
16+
factory Contact([updates(ContactBuilder b)]) = _$Contact;
17+
}

0 commit comments

Comments
 (0)