Skip to content

Commit ac9ff8a

Browse files
mregandlaphillwiggins
authored andcommitted
example app migration to use Sembast v2 (#294)
* Setting installationId in _Session object during sign-up * example app migration to use Sembast v2
1 parent a2cc66c commit ac9ff8a

File tree

9 files changed

+82
-55
lines changed

9 files changed

+82
-55
lines changed

example/android/app/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ apply plugin: 'com.android.application'
1515
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
1616

1717
android {
18-
compileSdkVersion 27
18+
compileSdkVersion 28
1919

2020
lintOptions {
2121
disable 'InvalidPackage'
@@ -25,7 +25,7 @@ android {
2525
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
2626
applicationId "com.example.flutterpluginexample"
2727
minSdkVersion 16
28-
targetSdkVersion 27
28+
targetSdkVersion 28
2929
versionCode 1
3030
versionName "1.0"
3131
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@@ -46,6 +46,6 @@ flutter {
4646

4747
dependencies {
4848
testImplementation 'junit:junit:4.12'
49-
androidTestImplementation 'com.android.support.test:runner:1.0.1'
50-
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
49+
androidTestImplementation 'com.android.support.test:runner:1.0.2'
50+
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
5151
}

example/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
}
66

77
dependencies {
8-
classpath 'com.android.tools.build:gradle:3.0.1'
8+
classpath 'com.android.tools.build:gradle:3.5.3'
99
}
1010
}
1111

example/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

example/lib/data/repositories/diet_plan/provider_db_diet_plan.dart

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,18 @@ import 'package:sembast/sembast.dart';
1010
class DietPlanProviderDB implements DietPlanProviderContract {
1111
DietPlanProviderDB(this._db, this._store);
1212

13-
final Store _store;
13+
final StoreRef<String, Map<String, dynamic>> _store;
1414
final Database _db;
1515

1616
@override
1717
Future<ApiResponse> add(DietPlan item) async {
1818
final Map<String, dynamic> values = convertItemToStorageMap(item);
19-
final Record recordToAdd = Record(_store, values, item.objectId);
20-
final Record recordFromDB = await _db.putRecord(recordToAdd);
19+
await _store.record(item.objectId).put(_db, values);
20+
final Map<String, dynamic> recordFromDB =
21+
await _store.record(item.objectId).get(_db);
22+
2123
return ApiResponse(
22-
true, 200, <dynamic>[convertRecordToItem(record: recordFromDB)], null);
24+
true, 200, <dynamic>[convertRecordToItem(values: recordFromDB)], null);
2325
}
2426

2527
@override
@@ -48,10 +50,12 @@ class DietPlanProviderDB implements DietPlanProviderContract {
4850
final List<SortOrder> sortOrders = List<SortOrder>();
4951
sortOrders.add(SortOrder(keyName));
5052
final Finder finder = Finder(sortOrders: sortOrders);
51-
final List<Record> records = await _store.findRecords(finder);
53+
final List<RecordSnapshot<String, Map<String, dynamic>>> records =
54+
await _store.find(_db, finder: finder);
5255

5356
if (records.isNotEmpty) {
54-
for (final Record record in records) {
57+
for (final RecordSnapshot<String, Map<String, dynamic>> record
58+
in records) {
5559
final DietPlan userFood = convertRecordToItem(record: record);
5660
foodItems.add(userFood);
5761
}
@@ -64,7 +68,10 @@ class DietPlanProviderDB implements DietPlanProviderContract {
6468

6569
@override
6670
Future<ApiResponse> getById(String id) async {
67-
final Record record = await _store.getRecord(id);
71+
final Finder finder = Finder(filter: Filter.equals('objectId', id));
72+
73+
final RecordSnapshot<String, Map<String, dynamic>> record =
74+
await _store.findFirst(_db, finder: finder);
6875
if (record != null) {
6976
final DietPlan userFood = convertRecordToItem(record: record);
7077
return ApiResponse(true, 200, <dynamic>[userFood], null);
@@ -81,9 +88,10 @@ class DietPlanProviderDB implements DietPlanProviderContract {
8188
filter:
8289
Filter.greaterThan(keyVarUpdatedAt, date.millisecondsSinceEpoch));
8390

84-
final List<Record> records = await _store.findRecords(finder);
91+
final List<RecordSnapshot<String, Map<String, dynamic>>> records =
92+
await _store.find(_db, finder: finder);
8593

86-
for (final Record record in records) {
94+
for (final RecordSnapshot<String, Map<String, dynamic>> record in records) {
8795
final DietPlan convertedDietPlan = convertRecordToItem(record: record);
8896
foodItems.add(convertedDietPlan);
8997
}
@@ -97,7 +105,9 @@ class DietPlanProviderDB implements DietPlanProviderContract {
97105

98106
@override
99107
Future<ApiResponse> remove(DietPlan item) async {
100-
await _store.delete(item.objectId);
108+
final Finder finder =
109+
Finder(filter: Filter.equals('objectId', item.objectId));
110+
_store.delete(_db, finder: finder);
101111
return ApiResponse(true, 200, null, null);
102112
}
103113

@@ -123,14 +133,17 @@ class DietPlanProviderDB implements DietPlanProviderContract {
123133
@override
124134
Future<ApiResponse> update(DietPlan item) async {
125135
final Map<String, dynamic> values = convertItemToStorageMap(item);
126-
final dynamic returnedItems = await _store.update(values, item.objectId);
136+
final Finder finder =
137+
Finder(filter: Filter.equals('objectId', item.objectId));
138+
final int returnedCount =
139+
await _store.update(_db, values, finder: finder);
127140

128-
if (returnedItems == null) {
141+
if (returnedCount == 0) {
129142
return add(item);
130143
}
131144

132145
return ApiResponse(
133-
true, 200, <dynamic>[convertRecordToItem(values: returnedItems)], null);
146+
true, 200, <dynamic>[item], null);
134147
}
135148

136149
Map<String, dynamic> convertItemToStorageMap(DietPlan item) {
@@ -145,7 +158,9 @@ class DietPlanProviderDB implements DietPlanProviderContract {
145158
return values;
146159
}
147160

148-
DietPlan convertRecordToItem({Record record, Map<String, dynamic> values}) {
161+
DietPlan convertRecordToItem(
162+
{RecordSnapshot<String, Map<String, dynamic>> record,
163+
Map<String, dynamic> values}) {
149164
try {
150165
values ??= record.value;
151166
final DietPlan item =

example/lib/data/repositories/diet_plan/repository_diet_plan.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ class DietPlanRepository implements DietPlanProviderContract {
1515
if (mockDBProvider != null) {
1616
repository.db = mockDBProvider;
1717
} else {
18-
final Store store = dbConnection.getStore('repository_store');
18+
final StoreRef<String, Map<String, dynamic>> store =
19+
stringMapStoreFactory.store('repository_diet');
1920
repository.db = DietPlanProviderDB(dbConnection, store);
2021
}
2122

example/lib/data/repositories/user/provider_db_user.dart

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@ import 'contract_provider_user.dart';
1111
class UserProviderDB implements UserProviderContract {
1212
UserProviderDB(this._db, this._store);
1313

14-
final Store _store;
14+
final StoreRef<String, Map<String, dynamic>> _store;
1515
final Database _db;
1616

1717
@override
1818
Future<User> createUser(
1919
String username, String password, String emailAddress) async {
2020
final User user = User(username, password, emailAddress);
2121
final Map<String, dynamic> values = convertItemToStorageMap(user);
22-
final Record recordToAdd = Record(_store, values, user.objectId);
23-
final Record recordFromDB = await _db.putRecord(recordToAdd);
22+
await _store.record(user.objectId).put(_db, values);
23+
final Map<String, dynamic> recordFromDB =
24+
await _store.record(user.objectId).get(_db);
2425
return convertRecordToItem(record: recordFromDB);
2526
}
2627

@@ -36,7 +37,9 @@ class UserProviderDB implements UserProviderContract {
3637

3738
@override
3839
Future<ApiResponse> destroy(User user) async {
39-
await _store.delete(user.objectId);
40+
final Finder finder =
41+
Finder(filter: Filter.equals('objectId', user.objectId));
42+
await _store.delete(_db, finder: finder);
4043
return ApiResponse(true, 200, null, null);
4144
}
4245

@@ -53,8 +56,9 @@ class UserProviderDB implements UserProviderContract {
5356
@override
5457
Future<ApiResponse> save(User user) async {
5558
final Map<String, dynamic> values = convertItemToStorageMap(user);
56-
final Record recordToAdd = Record(_store, values, user.objectId);
57-
final Record recordFromDB = await _db.putRecord(recordToAdd);
59+
await _store.record(user.objectId).put(_db, values);
60+
final Map<String, dynamic> recordFromDB =
61+
await _store.record(user.objectId).get(_db);
5862
return ApiResponse(
5963
true, 200, <dynamic>[convertRecordToItem(record: recordFromDB)], null);
6064
}
@@ -88,7 +92,7 @@ class UserProviderDB implements UserProviderContract {
8892
return values;
8993
}
9094

91-
User convertRecordToItem({Record record, Map<String, dynamic> values}) {
95+
User convertRecordToItem({dynamic record, Map<String, dynamic> values}) {
9296
try {
9397
values ??= record.value;
9498
final User item = User.clone().fromJson(json.jsonDecode(values['value']));

example/lib/data/repositories/user/repository_user.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ class UserRepository implements UserProviderContract {
1515
if (mockDBProvider != null) {
1616
repository.db = mockDBProvider;
1717
} else {
18-
final Store store = dbConnection.getStore('reposutory_user');
18+
final StoreRef<String, Map<String, dynamic>> store =
19+
stringMapStoreFactory.store('repository_user');
1920
repository.db = UserProviderDB(dbConnection, store);
2021
}
2122

example/lib/main.dart

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:flutter_plugin_example/data/repositories/diet_plan/repository_di
1010
import 'package:flutter_plugin_example/data/repositories/user/repository_user.dart';
1111
import 'package:flutter_plugin_example/domain/constants/application_constants.dart';
1212
import 'package:flutter_plugin_example/domain/utils/db_utils.dart';
13+
import 'package:flutter_plugin_example/pages/decision_page.dart';
1314
import 'package:parse_server_sdk/parse_server_sdk.dart';
1415

1516
void main() {
@@ -55,7 +56,9 @@ class _MyAppState extends State<MyApp> {
5556
title: const Text('Plugin example app'),
5657
),
5758
body: Center(
58-
child: Text(text),
59+
//child: Text(text),
60+
child: DecisionPage(),
61+
//child: HomePage(),
5962
),
6063
),
6164
);
@@ -94,22 +97,22 @@ class _MyAppState extends State<MyApp> {
9497

9598
Future<void> runTestQueries() async {
9699
// Basic repository example
97-
/* await repositoryAddUser();
98-
await repositoryAddItems();
100+
//await repositoryAddUser();
101+
// await repositoryAddItems();
99102
await repositoryGetAllItems();
100-
*/
103+
101104
//Basic usage
102-
/* await createItem();
103-
await getAllItems();
104-
await getAllItemsByName();
105-
await getSingleItem();
106-
await getConfigs();
107-
await query();*/
108-
await initUser();
109-
/* await initInstallation();
110-
await function();
111-
await functionWithParameters();
112-
await test();*/
105+
//await createItem();
106+
//await getAllItems();
107+
//await getAllItemsByName();
108+
//await getSingleItem();
109+
//await getConfigs();
110+
//await query();
111+
//await initUser();
112+
//await initInstallation();
113+
//await function();
114+
//await functionWithParameters();
115+
//await test();
113116
}
114117

115118
Future<void> initInstallation() async {
@@ -221,7 +224,7 @@ class _MyAppState extends State<MyApp> {
221224
Future<void> initUser() async {
222225
// All return type ParseUser except all
223226
ParseUser user =
224-
ParseUser('RE9fU360lishjFKC5dLZS4Zwm', 'password', '[email protected]');
227+
ParseUser('RE9fU360lishjFKC5dLZS4Zwm', 'password', '[email protected]');
225228

226229
/// Sign-up
227230
/*ParseResponse response = await user.signUp();
@@ -353,7 +356,9 @@ class _MyAppState extends State<MyApp> {
353356

354357
final List<dynamic> json = const JsonDecoder().convert(dietPlansToAdd);
355358
for (final Map<String, dynamic> element in json) {
356-
final DietPlan dietPlan = DietPlan().fromJson(element);
359+
final DietPlan dietPlan = DietPlan();
360+
element.forEach(
361+
(String k, dynamic v) => dietPlan.set<dynamic>(k, parseDecode(v)));
357362
dietPlans.add(dietPlan);
358363
}
359364

@@ -376,7 +381,6 @@ class _MyAppState extends State<MyApp> {
376381
userRepo ??= UserRepository.init(await getDB());
377382
}
378383

379-
380384
/// Available options:
381385
/// SharedPreferences - Not secure but will work with older versions of SDK - CoreStoreSharedPrefsImpl
382386
/// Sembast - NoSQL DB - Has security - CoreStoreSembastImpl
@@ -387,10 +391,10 @@ class _MyAppState extends State<MyApp> {
387391
}
388392

389393
const String dietPlansToAdd =
390-
'[{"className":"Diet_Plans","Name":"Textbook","Description":"For an active lifestyle and a straight forward macro plan, we suggest this plan.","Fat":25,"Carbs":50,"Protein":25,"Status":0},'
391-
'{"className":"Diet_Plans","Name":"Body Builder","Description":"Default Body Builders Diet","Fat":20,"Carbs":40,"Protein":40,"Status":0},'
392-
'{"className":"Diet_Plans","Name":"Zone Diet","Description":"Popular with CrossFit users. Zone Diet targets similar macros.","Fat":30,"Carbs":40,"Protein":30,"Status":0},'
393-
'{"className":"Diet_Plans","Name":"Low Fat","Description":"Low fat diet.","Fat":15,"Carbs":60,"Protein":25,"Status":0},'
394-
'{"className":"Diet_Plans","Name":"Low Carb","Description":"Low Carb diet, main focus on quality fats and protein.","Fat":35,"Carbs":25,"Protein":40,"Status":0},'
395-
'{"className":"Diet_Plans","Name":"Paleo","Description":"Paleo diet.","Fat":60,"Carbs":25,"Protein":10,"Status":0},'
396-
'{"className":"Diet_Plans","Name":"Ketogenic","Description":"High quality fats, low carbs.","Fat":65,"Carbs":5,"Protein":30,"Status":0}]';
394+
'[{"className":"Diet_Plans","Name":"Textbook","Description":"For an active lifestyle and a straight forward macro plan, we suggest this plan.","Fat":25,"Carbs":50,"Protein":25,"Status":false},'
395+
'{"className":"Diet_Plans","Name":"Body Builder","Description":"Default Body Builders Diet","Fat":20,"Carbs":40,"Protein":40,"Status":false},'
396+
'{"className":"Diet_Plans","Name":"Zone Diet","Description":"Popular with CrossFit users. Zone Diet targets similar macros.","Fat":30,"Carbs":40,"Protein":30,"Status":false},'
397+
'{"className":"Diet_Plans","Name":"Low Fat","Description":"Low fat diet.","Fat":15,"Carbs":60,"Protein":25,"Status":false},'
398+
'{"className":"Diet_Plans","Name":"Low Carb","Description":"Low Carb diet, main focus on quality fats and protein.","Fat":35,"Carbs":25,"Protein":40,"Status":false},'
399+
'{"className":"Diet_Plans","Name":"Paleo","Description":"Paleo diet.","Fat":60,"Carbs":25,"Protein":10,"Status":false},'
400+
'{"className":"Diet_Plans","Name":"Ketogenic","Description":"High quality fats, low carbs.","Fat":65,"Carbs":5,"Protein":30,"Status":false}]';

example/lib/pages/home_page.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ class _HomePageState extends State<HomePage> {
2424
super.initState();
2525
final List<dynamic> json = const JsonDecoder().convert(dietPlansToAdd);
2626
for (final Map<String, dynamic> element in json) {
27-
final DietPlan dietPlan = DietPlan().fromJson(element);
27+
final DietPlan dietPlan = DietPlan();
28+
element.forEach(
29+
(String k, dynamic v) => dietPlan.set<dynamic>(k, parseDecode(v)));
2830
randomDietPlans.add(dietPlan);
2931
}
3032
}

0 commit comments

Comments
 (0)