Skip to content

Repository files navigation

Nitrite Database

Build StatusCoverage StatusJavadocsGitterBackers on Open CollectiveBackers on Open Collective

Logo 200

NOsql Object (NO2 a.k.a Nitrite) database is an open source nosql embedded document store written in Java. It has MongoDB like API. It supports both in-memory and single file based persistent store powered by MVStore engine of h2 database.

Nitrite is a server-less embedded database ideal for desktop, mobile or small web applications.

It features:

  • Embedded key-value/document and object store

  • In-memory off-heap store

  • Single file store

  • Very fast and lightweight MongoDB like API

  • Indexing

  • Full text search capability

  • Full Android compatibility (API Level 19)

  • Observable store

  • Both way replication via Nitrite DataGate server

Kotlin Extension

Nitrite has a kotlin extension called Potassium Nitrite for kotlin developers. Visit here for more details.

Data Explorer

To view the data of a nitrite database file, use Nitrite Explorer. More details can be found here.

Data Replication

To replicate data over different devices automatically, use Nitrite DataGate server. For more details visit here.

Getting Started with Nitrite

How To Install

To use Nitrite in any Java application, just add the below dependency:

Maven

<dependency>
<groupId>org.dizitart</groupId>
<artifactId>nitrite</artifactId>
<version>{version}</version>
</dependency>

Gradle

compile 'org.dizitart:nitrite:{version}'

Quick Examples

Initialize Database

//java initializationNitritedb = Nitrite.builder()
.compressed()
.filePath("/tmp/test.db")
.openOrCreate("user", "password");
//android initializationNitritedb = Nitrite.builder()
.compressed()
.filePath(getFilesDir().getPath() + "/test.db")
.openOrCreate("user", "password");

Create a Collection

// Create a Nitrite CollectionNitriteCollectioncollection = db.getCollection("test");
// Create an Object RepositoryObjectRepository<Employee> repository = db.getRepository(Employee.class);

Annotations for POJO

// provides index information for ObjectRepository@Indices({
@Index(value = "joinDate", type = IndexType.NonUnique),
@Index(value = "name", type = IndexType.Unique)
})
publicclassEmployeeimplementsSerializable {
// provides id field to uniquely identify an object inside an ObjectRepository@IdprivatelongempId;
privateDatejoinDate;
privateStringname;
privateStringaddress;
// ... public getters and setters
}

CRUD Operations

// create a document to populate dataDocumentdoc = createDocument("firstName", "John")
.put("lastName", "Doe")
.put("birthDay", newDate())
.put("data", newbyte[] {1, 2, 3})
.put("fruits", newArrayList<String>() {{ add("apple"); add("orange"); add("banana"); }})
.put("note", "a quick brown fox jump over the lazy dog");
// insert the documentcollection.insert(doc);
// update the documentcollection.update(eq("firstName", "John"), createDocument("lastName", "Wick"));
// remove the documentcollection.remove(doc);
// insert an objectEmployeeemp = newEmployee();
emp.setEmpId(124589);
emp.setFirstName("John");
emp.setLastName("Doe");
repository.insert(emp);

Create Indices

// create document indexcollection.createIndex("firstName", indexOptions(IndexType.NonUnique));
collection.createIndex("note", indexOptions(IndexType.Fulltext));
// create object index. It can also be provided via annotationrepository.createIndex("firstName", indexOptions(IndexType.NonUnique));

Query a Collection

Cursorcursor = collection.find(
// and clauseand(
// firstName == Johneq("firstName", "John"),
// elements of data array is less than 4elemMatch("data", lt("$", 4)),
// elements of fruits list has one element matching orangeelemMatch("fruits", regex("$", "orange")),
// note field contains string 'quick' using full-text indextext("note", "quick")
)
);
for (Documentdocument : cursor) {
// process the document
}
// create document by idDocumentdocument = collection.getById(nitriteId);
// query an object repository and create the first resultEmployeeemp = repository.find(eq("firstName", "John"))
.firstOrDefault();

Automatic Replication

// connect to a DataGate server running at localhost 9090 portDataGateClientdataGateClient = newDataGateClient("http://localhost:9090")
.withAuth("userId", "password");
DataGateSyncTemplatesyncTemplate
= newDataGateSyncTemplate(dataGateClient, "remote-collection@userId");
// create sync handleSyncHandlesyncHandle = Replicator.of(db)
.forLocal(collection)
// a DataGate sync template implementation
.withSyncTemplate(syncTemplate)
// replication attempt delay of 1 sec
.delay(timeSpan(1, TimeUnit.SECONDS))
// both-way replication
.ofType(ReplicationType.BOTH_WAY)
// sync event listener
.withListener(newSyncEventListener() {
@OverridepublicvoidonSyncEvent(SyncEventDataeventInfo) {
}
})
.configure();
// start sync in the background using handlesyncHandle.startSync();

Import/Export Data

// Export data to a fileExporterexporter = Exporter.of(db);
exporter.exportTo(schemaFile);
//Import data from the fileImporterimporter = Importer.of(db);
importer.importFrom(schemaFile);

More details are available in the reference document.

Release Notes

Release notes are available here.

Documentation

ReferenceAPI

Document

JavaDoc

Build

To build and test Nitrite

$ git clone https://github.com/dizitart/nitrite-database.git
$ cd nitrite-database
$ ./gradlew build

The test suite requires mongod to be running on localhost, listening on the default port. MongoDb is required to test replication using the DataGate server. Please run the below command to create the test user in mongo.

db.getSiblingDB('benchmark').createUser({user: 'bench',pwd: 'bench',roles: [{role: 'readWrite',db: 'benchmark'},{role: 'dbAdmin',db: 'benchmark'}]})

The test suite also requires android sdk 26 to be installed and ANDROID_HOME environment variable to be setup properly to test the android example.

Support / Feedback

For issues with, questions about, or feedback talk to us at Gitter.

Bugs / Feature Requests

Think you’ve found a bug? Want to see a new feature in the Nitrite? Please open an issue here. But before you file an issue please check if it is already existing or not.

Maintainers

  • Anindya Chatterjee

Contributors

This project exists thanks to all the people who contribute. Contribute. Contributors

Backers

Thank you to all our backers! 🙏 Become a backer

Backers

Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. Become a sponsor

SponsorSponsorSponsorSponsorSponsor

Presentation & Talks

Idan Sheinberg has given a talk on Nitrite at Kotlin Everywhere - TLV Edition meetup on October 27, 2019. Please find his presentation here.

Special Thanks

YourKit

I highly recommend YourKit Java Profiler for any performance critical application you make.

Check it out at https://www.yourkit.com/

About

Java embedded nosql document store

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages