Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP - property query dart26 #58

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
b4298ba
At least it's compiling
Buggaboo Oct 23, 2019
2e7fcb1
* Changed package visibility (due to the generic argument constraint,…
Buggaboo Oct 23, 2019
ab4ac49
Fixed confused nullptr implementation (aka undefined default value) f…
Buggaboo Oct 23, 2019
0b74bfc
simplify literal string concatenation
Buggaboo Oct 24, 2019
472e9c0
Added more tests, some tests are returning == OBX_ERROR_ILLEGAL_ARGUM…
Buggaboo Oct 24, 2019
4eb1f33
modified tests, added new tests, added more constraints
Buggaboo Oct 24, 2019
137bbf6
added another basic query .count test
Buggaboo Oct 24, 2019
5d1fe7a
print-out model.json into the generated file to avoid loading it at r…
vaind Oct 25, 2019
c13c616
correct native error message building
vaind Oct 25, 2019
dddcc97
updated deps
Buggaboo Oct 25, 2019
f421734
Struct no longer takes a generic arg
Buggaboo Oct 25, 2019
87542db
Replaced Pointer allocate / free with package:ffi's allocate and free
Buggaboo Oct 25, 2019
3cabbfe
replace load/store with value
Buggaboo Oct 25, 2019
37de6e1
added ref, so it seems that ref is being autogenerated
Buggaboo Oct 25, 2019
47255dc
prefixed ffi for a nameclash
Buggaboo Oct 25, 2019
1499ec3
fixed other struct issues
Buggaboo Oct 25, 2019
2cad369
fixed utf8 frees, not 100% sure this is correct,
Buggaboo Oct 25, 2019
20fcc56
Merge branch 'dev-dart26' into query-property-dev-dart26
Buggaboo Oct 25, 2019
5d8a021
added more basic query tests
Buggaboo Oct 25, 2019
a800282
model - set last property ID from the model, not the last present pro…
vaind Oct 28, 2019
8eaea82
Add initial mobile Flutter demo project
nalenz-objectbox Oct 25, 2019
180f876
flutter demo - add objectbox.aar locally temporarily
vaind Oct 25, 2019
56d9b96
change example app package ID to io.objectbox.flutterexample
nalenz-objectbox Oct 28, 2019
0402cc6
Add path_provider and intl dependencies to Flutter demo
nalenz-objectbox Oct 26, 2019
d407039
flutter demo - display and remove notes
nalenz-objectbox Oct 26, 2019
befa5f6
clean up native model building & fix error handling;
vaind Oct 29, 2019
e3c7996
simple integration tests
vaind Oct 29, 2019
ef10287
wrap Utf8.fromUtf8 to check null pointers
vaind Oct 29, 2019
703a040
make native array-based calls compatible with 32-bit platforms
vaind Oct 29, 2019
2ead86a
use native OBX_bytes_array helper functions to build, until we can ma…
vaind Oct 29, 2019
7c91659
rename docs to doc
vaind Oct 30, 2019
a19a788
flutter demo: use published objectbox-android
vaind Oct 30, 2019
1ff3efa
flutter demo: fix delete after insert
vaind Oct 30, 2019
a345775
update pubspec - add missing info
vaind Oct 30, 2019
5b49e02
split out contribution guidelines to a separate file
vaind Oct 30, 2019
232f46a
change example page to only list the mobile demo at the moment
vaind Oct 30, 2019
7f9f365
Merge pull request #61 from objectbox/8-mobile-example
vaind Oct 30, 2019
9c637c9
revert an unintentional flutter SDK dependency
vaind Oct 30, 2019
7880961
rename query condition notEqual() to notEquals() to align with the re…
vaind Oct 30, 2019
bff2ccc
exclude example and generator from analysis
vaind Oct 30, 2019
9d151c1
drop query condition `==` operator override for now, until it can be …
vaind Oct 30, 2019
f712515
linter: non_constant_identifier_names
vaind Oct 30, 2019
a152daa
bump package version: 0.4.0-dev.2
vaind Oct 30, 2019
1308142
move integration test TODO out of the docs section
vaind Oct 30, 2019
bbd6c14
Remove objectbox-model.json asset from objectbox_demo
nalenz-objectbox Oct 31, 2019
1cd200a
Prevent adding empty notes in objectbox_demo
nalenz-objectbox Oct 31, 2019
2dc1c0e
Fix date handling in Flutter demo
nalenz-objectbox Oct 31, 2019
d4ffb1e
Fix putMany test case
nalenz-objectbox Oct 31, 2019
b2dc25b
Add test case for 64 bit integer limits (#63)
nalenz-objectbox Oct 31, 2019
48852e5
rename objectbox_model_generator to objectbox_generator
vaind Oct 31, 2019
67993ca
generator - prepare for publishing
vaind Oct 31, 2019
2d99df1
exclude the example folder from code generation by default
vaind Oct 31, 2019
fafde37
Merge pull request #64 from objectbox/63-test-integer-limits
vaind Oct 31, 2019
98208af
rework readme
vaind Oct 31, 2019
d426c8f
remove query/index.dart in favor of query/query.dart
vaind Oct 31, 2019
a2efdbf
Remove test index.dart
nalenz-objectbox Oct 31, 2019
fa51c1f
reorganize a query test to be more readable
vaind Oct 31, 2019
b571130
handle box.remove() not-found without catching exceptions
vaind Oct 31, 2019
6b89922
Add test for null properties
nalenz-objectbox Oct 31, 2019
32f6984
Merge pull request #67 from objectbox/65-test-null-properties
nalenz-objectbox Oct 31, 2019
5547411
fix generator test runner after a dependency update
vaind Oct 31, 2019
93759ce
Merge remote-tracking branch 'origin/dev' into dev
vaind Oct 31, 2019
e481959
doc: add build_runner info to the readme
vaind Oct 31, 2019
76ee673
prepare v0.4.0
vaind Oct 31, 2019
80cca76
Merge pull request #60 from objectbox/dev
vaind Oct 31, 2019
4621b38
Merge branch 'dev' into dev-dart26
Buggaboo Nov 1, 2019
443d589
Merge branch 'dev-dart26' into query-property-dev-dart26
Buggaboo Nov 1, 2019
1abac13
min max sum fixed
Buggaboo Nov 1, 2019
fd58df0
add .sum .min .max test for floats
Buggaboo Nov 5, 2019
a5c0a71
.find's result array
Buggaboo Nov 5, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
20 changes: 17 additions & 3 deletions CHANGELOG.md
@@ -1,14 +1,28 @@
0.4.0 (2019-10-31)
------------------
* Flutter Android support
* Queries for all currently supported types
(thanks [Jasm Sison](https://github.com/Buggaboo) for [#27](https://github.com/objectbox/objectbox-dart/pull/27) and [#46](https://github.com/objectbox/objectbox-dart/pull/46)]
* More Box functions (count, isEmpty, contains, remove and their bulk variants)
(thanks [liquidiert](https://github.com/liquidiert) for [#42](https://github.com/objectbox/objectbox-dart/pull/42) and [#45](https://github.com/objectbox/objectbox-dart/pull/45)]
* Explicit write transactions
(thanks [liquidiert](https://github.com/liquidiert) for [#50](https://github.com/objectbox/objectbox-dart/pull/50)]
* Resolved linter issues
(thanks [Gregory Sech](https://github.com/GregorySech) for [#31](https://github.com/objectbox/objectbox-dart/pull/31)]
* Updated to objectbox-c 0.7.2
* First release on pub.dev

0.3.0 (2019-10-15)
------------------
* ID/UID generation and model persistence (objectbox-model.json)
* CI tests using GitHub Actions
* Code cleanup, refactoring and formatting
(thanks [Buggaboo](https://github.com/Buggaboo) for [#20](https://github.com/objectbox/objectbox-dart/pull/20) & [#21](https://github.com/objectbox/objectbox-dart/pull/21)]
(thanks [Jasm Sison](https://github.com/Buggaboo) for [#20](https://github.com/objectbox/objectbox-dart/pull/20) & [#21](https://github.com/objectbox/objectbox-dart/pull/21)]

0.2.0 (2019-09-11)
------------------
------------------Buggaboo
* UTF-8 support for Store and Box
(thanks to [Buggaboo](https://github.com/Buggaboo) for [#14](https://github.com/objectbox/objectbox-dart/pull/14)!)
(thanks to [Jasm Sison](https://github.com/Buggaboo) for [#14](https://github.com/objectbox/objectbox-dart/pull/14)!)
* Bulk put and get functions (getMany, getAll, putMany)
* Updated to objectbox-c 0.7
* Basic Store options
Expand Down
30 changes: 30 additions & 0 deletions CONTRIBUTING.md
@@ -0,0 +1,30 @@
Contributing
------------------
This project is completely managed on GitHub using its [issue tracker](https://github.com/objectbox/objectbox-dart/issues) and [project boards](https://github.com/objectbox/objectbox-dart/projects).

Anyone can contribute, be it by coding, improving docs or just proposing a new feature.
Look for tasks having a [**"help wanted"**](https://github.com/objectbox/objectbox-dart/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) tag.
When picking up an existing issue, please let us know in the issue comment.
Don't hesitate to reach out for guidance or to discuss a solution proposal!

### Code contributions
When creating a Pull Request for code changes, please check that you cover the following:
* Include tests for the changes you introduce. See the [test folder](test) for examples.
* Formatted the code using `dartfmt -l 120`. You can configure your IDE to do this automatically,
e.g. VS Code needs the project-specific settings `"editor.defaultFormatter": "Dart-Code.dart-code"` and `"dart.lineLength": 120`.

### Project workflow
Issues on the [project board](https://github.com/objectbox/objectbox-dart/projects/3) are referred to as "cards" which move from left to right:

* New cards start in the "To Do" column.
Within the column, cards are ordered: more important tasks should be above less important ones.
* Once somebody starts on a task, the according card is moved to "In progress".
Also, please assign yourself to the issue.
* Once a task is considered complete (e.g. PR is made), put it in the "Review" column.
* Once another person had a look and is happy, the task is finally moved to "Done" and its closed.

### Basic technical approach
ObjectBox offers a [C API](https://github.com/objectbox/objectbox-c) which can be called by [Dart FFI](https://dart.dev/server/c-interop).
The C API is is also used by the ObjectBox language bindings for [Go](https://github.com/objectbox/objectbox-go), [Swift](https://github.com/objectbox/objectbox-swift), and [Python](https://github.com/objectbox/objectbox-python).
These language bindings currently serve as an example for this Dart implementation.
Internally, ObjectBox uses [FlatBuffers](https://google.github.io/flatbuffers/) to store objects.
135 changes: 58 additions & 77 deletions README.md
Expand Up @@ -2,68 +2,50 @@ ObjectBox for Dart/Flutter
==========================
ObjectBox for Dart is a standalone database storing Dart objects locally, with strong ACID semantics.

Help wanted
-----------
ObjectBox for Dart is still in a prototype stage supporting only the most basic database tasks, like putting and getting objects.
However, the ObjectBox core supports many more features, e.g. queries, indexing, async operations, transaction control.
To bring all these features to Dart, we're asking the community to help out. PRs are more than welcome!
The ObjectBox team will try its best to guide you and answer questions.

Contributing
------------------
This project is completely managed here on GitHub using its [issue tracker](https://github.com/objectbox/objectbox-dart/issues) and [project boards](https://github.com/objectbox/objectbox-dart/projects).

To prepare an upcoming version, we create a (Kanban like) board for it.
Once it is decided which features and fixes go into the version, the according issues are added to the board.
Issues on the board are referred to as "cards" which move from left to right:

* New cards start in the "To Do" column.
Within the column, cards are ordered: more important tasks should be above less important ones.
* Once somebody starts on a task, the according card is moved to "In progress".
Also, please assign yourself to the issue.
* Once a task is considered complete (e.g. PR is made), put it in the "Review" column.
* Once another person had a look and is happy, the task is finally moved to "Done"

Anyone can contribute, be it by coding, improving docs or just proposing a new feature.
Look for tasks having a **"help wanted"** tag.

#### Feedback
Also, please let us know your feedback by opening an issue:
for example, if you experience errors or if you have ideas for how to improve the API.
Thanks!
Installation
------------
Add the following dependencies to your `pubspec.yaml`:
```yaml
dependencies:
objectbox: ^0.4.0

dev_dependencies:
build_runner: ^1.0.0
objectbox_generator: ^0.4.0
```

#### Code style
Please make sure that all code submitted via Pull Request is formatted using `dartfmt -l 120`.
You can configure your IDE to do this automatically, e.g. VS Code needs the project-specific settings
`"editor.defaultFormatter": "Dart-Code.dart-code"` and `"dart.lineLength": 120`.
Proceed based on whether you're developing a Flutter app or a standalone dart program:
1. **Flutter** only steps:
* Install the packages `flutter pub get`
* Add `objectbox-android` dependency to your `android/app/build.gradle`
```
dependencies {
implementation "io.objectbox:objectbox-android:2.4.1"
...
```
* iOS coming soon
1. **Dart standalone programs**:
* Install the packages `pub get`
* Install [objectbox-c](https://github.com/objectbox/objectbox-c) system-wide:
* macOS/Linux: execute the following command (answer Y when it asks about installing to /usr/lib)
```shell script
bash <(curl -s https://raw.githubusercontent.com/objectbox/objectbox-c/master/download.sh) 0.7.2
```
* macOS: if dart later complains that it cannot find the `libobjectbox.dylib` you probably have to unsign the
`dart` binary (source: [dart issue](https://github.com/dart-lang/sdk/issues/38314#issuecomment-534102841)):
```shell script
sudo xcode --remove-signature $(which dart)
```
* Windows: use "Git Bash" or similar to execute the following command
```shell script
bash <(curl -s https://raw.githubusercontent.com/objectbox/objectbox-c/master/download.sh) 0.7.2
```
Then copy the downloaded `lib/objectbox.dll` to `C:\Windows\System32\` (requires admin privileges).

ObjectBox generates code binding code for classes you want stored based using build_runner.
After you've defined your persisted entities (see below), run `pub run build_runner build` or `flutter pub run build_runner build`.

Getting started
---------------
To try out the demo code in this repository, follow these steps:

1. Install [objectbox-c](https://github.com/objectbox/objectbox-c) system-wide:
* macOS/Linux: `bash <(curl -s https://raw.githubusercontent.com/objectbox/objectbox-c/master/download.sh) 0.7` (answer Y when it asks about installing to /usr/lib).
* Windows:
* use "Git Bash" or similar to execute `bash <(curl -s https://raw.githubusercontent.com/objectbox/objectbox-c/master/download.sh) 0.7`
* copy the downloaded `lib/objectbox.dll` to `C:\Windows\System32\` (requires admin privileges)
2. Back in this repository, run `pub get`.
3. Execute `pub run build_runner build`. This regenerates the ObjectBox model to make it usable in Dart
(i.e. the file `test/test.g.dart`) and is necessary each time you add or change a class annotated with `@Entity(...)`.
4. Finally run `pub run test` to run the unit tests.

Mac OS signed dart binary issue
-------------------------------

If dart complains that it cannot find the `libobjectbox.dylib`, after you've installed by following step 1,
then you probably have to unsign the dart binary:

```bash
sudo xcode --remove-signature `which dart`
```

source: [dart issue](https://github.com/dart-lang/sdk/issues/38314#issuecomment-534102841)

Dart integration
----------------
In general, Dart class annotations are used to mark classes as ObjectBox entities and provide meta information.
Note that right now, only a limited set of types is supported; this will be expanded upon in the near future.
Expand Down Expand Up @@ -110,8 +92,7 @@ print("refetched note: ${box.get(note.id)}");
store.close();
```

Query and QueryBuilder
----------------------
### Query and QueryBuilder

Basic querying can be done with e.g.:

Expand All @@ -124,7 +105,7 @@ box.put(Note.construct("Hello world!"));

final queryNullText = box.query(Note_.text.isNull()).build();

assert (queryNullText.count() == 3);
assert(queryNullText.count() == 3);

queryNullText.close(); // We have to manually close queries and query builders.
```
Expand All @@ -136,16 +117,15 @@ respectively `==`, `>`, `<`, `&`, `|`.
```dart
// final box ...

box.query(text.equal("meh").or(text.equal("bleh")).or(text.contains("Hello"))).build();
box.query(value.greaterThan(10).or(date.IsNull())).build();

// equivalent to

final overloaded = ((text == "meh") | (text == "bleh")) | text.contains("Hello");
final overloaded = (value > 10) | date.IsNull();
box.query(overloaded as Condition).build(); // the cast is necessary due to the type analyzer
```

Ordering
--------
### Ordering

The results from a query can be ordered using the `order` method, e.g.

Expand All @@ -161,20 +141,21 @@ final qt = box.query(Entity_.text.notNull())
.build();
```

Basic technical approach
------------------------
ObjectBox offers a [C API](https://github.com/objectbox/objectbox-c) which can be called by [Dart FFI](https://dart.dev/server/c-interop).
The C API is is also used by the ObjectBox language bindings for [Go](https://github.com/objectbox/objectbox-go), [Swift](https://github.com/objectbox/objectbox-swift), and [Python](https://github.com/objectbox/objectbox-python).
These language bindings currently serve as an example for this Dart implementation.
Help wanted
-----------
ObjectBox for Dart is still in an early stage with limited feature set (compared to other languages).
To bring all these features to Dart, we're asking the community to help out. PRs are more than welcome!
The ObjectBox team will try its best to guide you and answer questions.

Internally, ObjectBox uses [FlatBuffers](https://google.github.io/flatbuffers/) to store objects.
There are two basic ways to make the conversion: generated binding code, or implicit FlatBuffers conversion.
The latter is used at the moment (helped us to get started quickly).
A future version will exchange that with code generation.
### Feedback
Also, please let us know your feedback by opening an issue:
for example, if you experience errors or if you have ideas for how to improve the API.
Thanks!

Changelog
See also
---------
[CHANGELOG.md](CHANGELOG.md)
* [Changelog](CHANGELOG.md)
* [Contribution guidelines](CONTRIBUTING.md)

License
-------
Expand Down
8 changes: 7 additions & 1 deletion analysis_options.yaml
Expand Up @@ -2,4 +2,10 @@ include: package:pedantic/analysis_options.yaml

linter:
rules:
unrelated_type_equality_checks: false # query condition operator overrides
# additional rules used by pub.dev
- non_constant_identifier_names

analyzer:
exclude:
- example/**
- generator/** # needs to be checked separately because its a separate package
6 changes: 3 additions & 3 deletions docs/code-generation.md → doc/code-generation.md
Expand Up @@ -2,11 +2,11 @@

To make it possible to read and write ObjectBox entity instances as easily as possible, wrapper code needs to be generated. Such code is only generated for Dart classes which have been annotated to indicate that they represent an ObjectBox entity (i.e. using [`@Entity`](/lib/src/annotations.dart#L1)). For a Dart source file called `myentity.dart`, which contains an entity definition, a file called `myentity.g.dart` is generated in the same directory by invoking the command `pub run build_runner build`.

Unfortunately, only few documentation exists on how to generate code using Dart's `build`, `source_gen` and `build_runner`, so the approach taken here by `objectbox_model_generator` is documented in the following.
Unfortunately, only few documentation exists on how to generate code using Dart's `build`, `source_gen` and `build_runner`, so the approach taken here by `objectbox_generator` is documented in the following.

## Basics

In order to set up code generation, a new package needs to be created exclusively for this task. Here, it it called `objectbox_model_generator`. This package needs to contain a file called [`build.yaml`](/generator/build.yaml) as well as an entry point for the builder, [`builder.dart`](/generator/lib/builder.dart), and a generator specifically for one annotation class, [`generator.dart`](/generator/lib/src/generator.dart). The latter needs to contain a class which extends `GeneratorForAnnotation<obx.Entity>` and overrides `Future<String> generateForAnnotatedElement(Element elementBare, ConstantReader annotation, BuildStep buildStep)`, which returns a string containing the generated code for a single annotation instance.
In order to set up code generation, a new package needs to be created exclusively for this task. Here, it it called `objectbox_generator`. This package needs to contain a file called [`build.yaml`](/generator/build.yaml) as well as an entry point for the builder, [`objectbox_generator.dart`](/generator/lib/objectbox_generator.dart), and a generator specifically for one annotation class, [`generator.dart`](/generator/lib/src/generator.dart). The latter needs to contain a class which extends `GeneratorForAnnotation<obx.Entity>` and overrides `Future<String> generateForAnnotatedElement(Element elementBare, ConstantReader annotation, BuildStep buildStep)`, which returns a string containing the generated code for a single annotation instance.

It is then possible to traverse through the annotated class in `generateForAnnotatedElement` and e.g. determine all class member fields and their types. Additionally, such member fields can be annotated themselves, but because here, only the `@Entity` annotation is explicitly handled using a separate generator class, member annotations can be read and processed in line.

Expand All @@ -20,7 +20,7 @@ Eventually, `mergeEntity` either throws an error in case the model cannot be mer

## Testing

For accomplishing actually automated testing capabilities for `objectbox_model_generator`, various wrapper classes are needed, as the `build` package is only designed to generate output _files_; yet, during testing, it is necessary to dump generated code to string variables, so they can be compared easily by Dart's `test` framework.
For accomplishing actually automated testing capabilities for `objectbox_generator`, various wrapper classes are needed, as the `build` package is only designed to generate output _files_; yet, during testing, it is necessary to dump generated code to string variables, so they can be compared easily by Dart's `test` framework.

The entry function for generator testing is the main function of [`generator_test.dart`](/generator/test/generator_test.dart). It makes sure that any existing file called `objectbox-model.json` is removed before every test, because we want a fresh start each time.

Expand Down
2 changes: 1 addition & 1 deletion docs/modelinfo.md → doc/modelinfo.md
Expand Up @@ -14,4 +14,4 @@ Nonetheless, the concrete implementation in this repository is documented in the
- [`ModelEntity`](/lib/src/modelinfo/modelentity.dart) describes an entity of a model and consists of instances of `ModelProperty` as well as an id, name and last property id
- [`ModelInfo`](/lib/src/modelinfo/modelinfo.dart) logically contains an entire ObjectBox model file like [this one](/objectbox-model.json) and thus consists of an array of `ModelEntity` as well as various meta information for ObjectBox and model version information

Such model meta information is only actually needed when generating `objectbox-model.json`, i.e. when `objectbox_model_generator` is invoked. This is the case in [`generator.dart`](/generator/lib/src/generator.dart#L24). In [generated code](/generator/lib/src/code_chunks.dart#L12), the JSON file is loaded in the same way, but only the `ModelEntity` instances are kept.
Such model meta information is only actually needed when generating `objectbox-model.json`, i.e. when `objectbox_generator` is invoked. This is the case in [`generator.dart`](/generator/lib/src/generator.dart#L24). In [generated code](/generator/lib/src/code_chunks.dart#L12), the JSON file is loaded in the same way, but only the `ModelEntity` instances are kept.
2 changes: 1 addition & 1 deletion example/README.md
@@ -1,4 +1,4 @@
ObjectBox Examples
==========================

* [Flutter desktop app](flutter/objectbox_demo_desktop) - requires (pre-release) Flutter 1.10 (Dart 2.6)
* [Flutter android app](flutter/objectbox_demo) - requires Flutter 1.9
38 changes: 38 additions & 0 deletions example/flutter/objectbox_demo/.gitignore
@@ -0,0 +1,38 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.packages
.pub-cache/
.pub/
/build/

# Web related
lib/generated_plugin_registrant.dart

# Exceptions to above rules.
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages

objectbox
10 changes: 10 additions & 0 deletions example/flutter/objectbox_demo/.metadata
@@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
revision: a4d5266b769e92286a48f6b6714e538f2c4578dc
channel: master

project_type: app
5 changes: 5 additions & 0 deletions example/flutter/objectbox_demo/README.md
@@ -0,0 +1,5 @@
# objectbox_demo

## Getting Started

This project contains the Flutter version of the main example from the [objectbox-examples](https://github.com/objectbox/objectbox-examples) repository.
7 changes: 7 additions & 0 deletions example/flutter/objectbox_demo/android/.gitignore
@@ -0,0 +1,7 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java