agconnect_clouddb 1.3.0+300 copy "agconnect_clouddb: ^1.3.0+300" to clipboard
agconnect_clouddb: ^1.3.0+300 copied to clipboard

outdated

CloudDB is a device-cloud synergy database product that provides data synergy management capabilities between device and cloud.

example/lib/main.dart

//  Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.

import 'dart:async';

import 'package:agconnect_auth/agconnect_auth.dart';
import 'package:agconnect_clouddb/agconnect_clouddb.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(_App());
}

class _App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: _HomeScreen(),
    );
  }
}

class _HomeScreen extends StatefulWidget {
  @override
  __HomeScreenState createState() => __HomeScreenState();
}

class __HomeScreenState extends State<_HomeScreen> {
  final String _zoneName = 'QuickStartDemo';
  final String _objectTypeName = 'BookInfo';
  AGConnectCloudDBZone _zone;
  String _currentUserUid;
  StreamSubscription<AGConnectCloudDBZoneSnapshot> _snapshotSubscription;
  StreamSubscription<String> _onEvent;
  StreamSubscription<bool> _onDataEncryptionKeyChanged;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      try {
        await _initCurrentUser();
        await AGConnectCloudDB.getInstance().initialize();
        await AGConnectCloudDB.getInstance().createObjectType();
        _onEvent = AGConnectCloudDB.getInstance().onEvent().listen((String event) {
          _showDialog(context, 'On Event: $event');
        });
        _onDataEncryptionKeyChanged = AGConnectCloudDB.getInstance().onDataEncryptionKeyChanged().listen((bool data) {
          _showDialog(context, 'Data Encryption Key Changed: $data');
        });
      } catch (e) {
        _handleException(e);
      }
    });
  }

  @override
  void dispose() {
    if (_snapshotSubscription != null) {
      _snapshotSubscription.cancel();
    }
    if (_onEvent != null) {
      _onEvent.cancel();
    }
    if (_onDataEncryptionKeyChanged != null) {
      _onDataEncryptionKeyChanged.cancel();
    }
    super.dispose();
  }

  Future<void> _initCurrentUser() async {
    final AGCUser currentUser = await AGCAuth.instance.currentUser;
    if (currentUser != null) {
      setState(() => _currentUserUid = currentUser.uid);
    } else {
      final SignInResult signInResult = await AGCAuth.instance.signInAnonymously();
      if (signInResult.user != null) {
        setState(() => _currentUserUid = signInResult.user.uid);
      } else {
        setState(() => _currentUserUid = '???');
      }
    }
  }

  void _showDialog(BuildContext context, [String content = 'SUCCESS']) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('RESULT'),
          content: SingleChildScrollView(
            physics: const BouncingScrollPhysics(),
            child: Text(content),
          ),
        );
      },
    );
  }

  Widget _buildGroup({List<Widget> children}) {
    return Container(
      margin: const EdgeInsets.symmetric(vertical: 8),
      decoration: const BoxDecoration(
        color: Colors.black12,
        borderRadius: BorderRadius.all(Radius.circular(16)),
      ),
      child: Wrap(
        alignment: WrapAlignment.center,
        children: children,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(_zoneName),
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.refresh),
            onPressed: () async {
              await AGCAuth.instance.signOut();
              setState(() => _currentUserUid = null);
              await _initCurrentUser();
            },
          ),
        ],
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(16),
            child: Text('UserID: $_currentUserUid'),
          ),
          Expanded(
            child: ListView(
              padding: const EdgeInsets.all(16),
              physics: const BouncingScrollPhysics(),
              children: <Widget>[
                _buildGroup(
                  children: <Widget>[
                    FlatButton(
                      child: const Text('openCloudDBZone'),
                      onPressed: _openCloudDBZone,
                    ),
                    FlatButton(
                      child: const Text('openCloudDBZone2'),
                      onPressed: _openCloudDBZone2,
                    ),
                    FlatButton(
                      child: const Text('closeCloudDBZone'),
                      onPressed: _closeCloudDBZone,
                    ),
                    FlatButton(
                      child: const Text('deleteCloudDBZone'),
                      onPressed: _deleteCloudDBZone,
                    ),
                  ],
                ),
                _buildGroup(
                  children: <Widget>[
                    FlatButton(
                      child: const Text('getCloudDBZoneConfig'),
                      onPressed: _getCloudDBZoneConfig,
                    ),
                    FlatButton(
                      child: const Text('getCloudDBZoneConfigs'),
                      onPressed: _getCloudDBZoneConfigs,
                    ),
                  ],
                ),
                _buildGroup(
                  children: <Widget>[
                    FlatButton(
                      child: const Text('enableNetwork'),
                      onPressed: _enableNetwork,
                    ),
                    FlatButton(
                      child: const Text('disableNetwork'),
                      onPressed: _disableNetwork,
                    ),
                  ],
                ),
                _buildGroup(
                  children: <Widget>[
                    FlatButton(
                      child: const Text('setUserKey'),
                      onPressed: _setUserKey,
                    ),
                    FlatButton(
                      child: const Text('updateDataEncryptionKey'),
                      onPressed: _updateDataEncryptionKey,
                    ),
                  ],
                ),
                const Divider(height: 32),
                _buildGroup(
                  children: <Widget>[
                    FlatButton(
                      child: const Text('subscribeSnapshot'),
                      onPressed: _subscribeSnapshot,
                    ),
                    FlatButton(
                      child: const Text('removeSnapshot'),
                      onPressed: () {
                        if (_snapshotSubscription != null) {
                          _snapshotSubscription.cancel().then((_) {
                            _snapshotSubscription = null;
                            _showDialog(context);
                          });
                        }
                      },
                    ),
                  ],
                ),
                const Divider(height: 32),
                _buildGroup(
                  children: <Widget>[
                    FlatButton(
                      child: const Text('executeUpsert'),
                      onPressed: _executeUpsert,
                    ),
                    FlatButton(
                      child: const Text('executeDelete'),
                      onPressed: _executeDelete,
                    ),
                    FlatButton(
                      child: const Text('runTransaction'),
                      onPressed: _runTransaction,
                    ),
                  ],
                ),
                _buildGroup(
                  children: <Widget>[
                    FlatButton(
                      child: const Text('executeQuery'),
                      onPressed: _executeQuery,
                    ),
                    FlatButton(
                      child: const Text('executeQueryUnsynced'),
                      onPressed: _executeQueryUnsynced,
                    ),
                  ],
                ),
                _buildGroup(
                  children: <Widget>[
                    FlatButton(
                      child: const Text('executeCountQuery'),
                      onPressed: _executeCountQuery,
                    ),
                    FlatButton(
                      child: const Text('executeSumQuery'),
                      onPressed: _executeSumQuery,
                    ),
                    FlatButton(
                      child: const Text('executeAverageQuery'),
                      onPressed: _executeAverageQuery,
                    ),
                    FlatButton(
                      child: const Text('executeMinimalQuery'),
                      onPressed: _executeMinimalQuery,
                    ),
                    FlatButton(
                      child: const Text('executeMaximumQuery'),
                      onPressed: _executeMaximumQuery,
                    ),
                  ],
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  void _handleException(dynamic e) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('ERROR'),
          content: Text(
            e is FormatException ? e.message : AGConnectCloudDBException.from(e).message,
          ),
        );
      },
    );
  }

  Future<void> _openCloudDBZone() async {
    try {
      if (_zone != null) {
        throw FormatException('Zone object is not null. First try close zone.', _zone);
      }

      _zone = await AGConnectCloudDB.getInstance().openCloudDBZone(
        zoneConfig: AGConnectCloudDBZoneConfig(
          zoneName: _zoneName,
        ),
      );
      _showDialog(context);
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _openCloudDBZone2() async {
    try {
      if (_zone != null) {
        throw FormatException('Zone object is not null. First try close zone.', _zone);
      }

      _zone = await AGConnectCloudDB.getInstance().openCloudDBZone2(
        zoneConfig: AGConnectCloudDBZoneConfig(
          zoneName: _zoneName,
        ),
      );
      _showDialog(context);
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _closeCloudDBZone() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      await AGConnectCloudDB.getInstance().closeCloudDBZone(
        zone: _zone,
      );
      _zone = null;
      _showDialog(context);
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _deleteCloudDBZone() async {
    try {
      await AGConnectCloudDB.getInstance().deleteCloudDBZone(
        zoneName: _zoneName,
      );
      _showDialog(context);
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _enableNetwork() async {
    try {
      await AGConnectCloudDB.getInstance().enableNetwork(
        zoneName: _zoneName,
      );
      _showDialog(context);
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _disableNetwork() async {
    try {
      await AGConnectCloudDB.getInstance().disableNetwork(
        zoneName: _zoneName,
      );
      _showDialog(context);
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _setUserKey() async {
    try {
      await AGConnectCloudDB.getInstance().setUserKey(
        userKey: '123456789',
        userReKey: '',
      );
      _showDialog(context);
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _updateDataEncryptionKey() async {
    try {
      await AGConnectCloudDB.getInstance().updateDataEncryptionKey();
      _showDialog(context);
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _getCloudDBZoneConfig() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final AGConnectCloudDBZoneConfig config = await _zone.getCloudDBZoneConfig();
      _showDialog(context, config.toString());
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _getCloudDBZoneConfigs() async {
    try {
      final List<AGConnectCloudDBZoneConfig> configs = await AGConnectCloudDB.getInstance().getCloudDBZoneConfigs();
      _showDialog(context, configs.toString());
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _executeUpsert() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final int count = await _zone.executeUpsert(
        objectTypeName: _objectTypeName,
        entries: <Map<String, dynamic>>[
          <String, dynamic>{
            'id': 1,
            'bookName': 'Book Name - 1',
            'price': 14.80,
          },
          <String, dynamic>{
            'id': 2,
            'bookName': 'Book Name - 2',
            'price': 22.99,
          },
          <String, dynamic>{
            'id': 3,
            'bookName': 'Book Name - 3',
            'price': 5.60,
          },
        ],
      );
      _showDialog(context, '$count objects successfully written.');
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _executeDelete() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final int count = await _zone.executeDelete(
        objectTypeName: _objectTypeName,
        entries: <Map<String, dynamic>>[
          <String, dynamic>{
            'id': 2,
          },
        ],
      );
      _showDialog(context, '$count objects successfully deleted.');
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _executeQuery() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final AGConnectCloudDBZoneSnapshot snapshot = await _zone.executeQuery(
        query: AGConnectCloudDBQuery(_objectTypeName)..orderBy('price'),
        policy: AGConnectCloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT,
      );
      _showDialog(context, snapshot.toString());
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _executeQueryUnsynced() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final AGConnectCloudDBZoneSnapshot snapshot = await _zone.executeQueryUnsynced(
        query: AGConnectCloudDBQuery(_objectTypeName)..orderBy('price'),
      );
      _showDialog(context, snapshot.toString());
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _executeAverageQuery() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final dynamic average = await _zone.executeAverageQuery(
        field: 'price',
        query: AGConnectCloudDBQuery(_objectTypeName),
        policy: AGConnectCloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT,
      );
      _showDialog(context, average.toString());
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _executeSumQuery() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final dynamic sum = await _zone.executeSumQuery(
        field: 'price',
        query: AGConnectCloudDBQuery(_objectTypeName),
        policy: AGConnectCloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT,
      );
      _showDialog(context, sum.toString());
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _executeMaximumQuery() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final dynamic maximum = await _zone.executeMaximumQuery(
        field: 'price',
        query: AGConnectCloudDBQuery(_objectTypeName),
        policy: AGConnectCloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT,
      );
      _showDialog(context, maximum.toString());
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _executeMinimalQuery() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final dynamic minimal = await _zone.executeMinimalQuery(
        field: 'price',
        query: AGConnectCloudDBQuery(_objectTypeName),
        policy: AGConnectCloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT,
      );
      _showDialog(context, minimal.toString());
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _executeCountQuery() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      final int count = await _zone.executeCountQuery(
        field: 'price',
        query: AGConnectCloudDBQuery(_objectTypeName),
        policy: AGConnectCloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT,
      );
      _showDialog(context, count.toString());
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _runTransaction() async {
    try {
      if (_zone == null) {
        throw FormatException('Zone object is null. First try open zone.', _zone);
      }

      await _zone.runTransaction(
        transaction: AGConnectCloudDBTransaction()
          ..executeUpsert(
            objectTypeName: _objectTypeName,
            entries: <Map<String, dynamic>>[
              <String, dynamic>{
                'id': 10,
                'bookName': 'Book_10',
                'price': 5.10,
              },
              <String, dynamic>{
                'id': 20,
                'bookName': 'Book_20',
                'price': 25.20,
              },
            ],
          )
          ..executeDelete(
            objectTypeName: _objectTypeName,
            entries: <Map<String, dynamic>>[
              <String, dynamic>{
                'id': 10,
              },
            ],
          ),
      );
      _showDialog(context);
    } catch (e) {
      _handleException(e);
    }
  }

  Future<void> _subscribeSnapshot() async {
    try {
      if (_snapshotSubscription == null) {
        if (_zone == null) {
          throw FormatException('Zone object is null. First try open zone.', _zone);
        }

        final Stream<AGConnectCloudDBZoneSnapshot> stream = await _zone.subscribeSnapshot(
          query: AGConnectCloudDBQuery(_objectTypeName)..equalTo('id', 2),
          policy: AGConnectCloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT,
        );
        _snapshotSubscription = stream.listen((AGConnectCloudDBZoneSnapshot snapshot) {
          _showDialog(context, snapshot.toString());
        }, onError: (dynamic e) {
          _handleException(e);
        });
      }
    } catch (e) {
      _handleException(e);
    }
  }
}
2
likes
0
points
1
downloads

Publisher

unverified uploader

Weekly Downloads

CloudDB is a device-cloud synergy database product that provides data synergy management capabilities between device and cloud.

Homepage

License

unknown (license)

Dependencies

flutter

More

Packages that depend on agconnect_clouddb

Packages that implement agconnect_clouddb