A Java/Kotlin library for Android platform, to manage bean's persistence in SQLite, SharedPreferences, JSON, XML, Properties, Yaml, CBOR.

Overview

Android Weekly Android Arsenal download maven central test coverage Codacy Badge Project Stats Build Status

Thanks to JetBrains for support Kripton Persistence Library project!

Kripton Persistence Library

Kripton is a java library, for Android platform, that provides a simple and uniform way to manage persistence of Java classes in different flavours through annotations and interface. Kripton can do for you:

  • generate all the code necessary to persist your POJO in a SQLite database (Light-ORM functionality). It's support Live Data and Androidx JetPack.
  • generate all the code necessary to convert POJO object in different data format: JSON, XML, CBOR, properties, YAML
  • generate all the code to persist your POJO in Shared Preferences. It's support Live Data and Androidx JetPack.
  • Kripton can be integrated to Retrofit library to generate all code necessary to JSON-2-Java convertion without any reflection code.
  • You can use Kripton with Kotlin too.

Does it sound interesting? I hope so! :)

The Kripton's key features are summarized in the following image.

Screenshot 2020-11-06 at 21 56 58

To get max performance and avoid boilerplate-code, Kripton use annotation processor. With the power of annotation processor is possible to create code to persist a java class, simply with an annotation. There are many other libraries that do this, but Kripton allows to persists java object without using reflection and with just few lines of code.

Kripton is fully working with Kotlin too.

See wiki for more informations.

See benchmarks for more informations about SQLite and JSON persistence perfomance.

If you are interested in Kripton Persistence Library, visit abubusoft.com

Setup

Kritpon requires at minimum Java 8 or Android 3.0.

Gradle configuration

You can use Kritpon Annotation Processor and Kripton Persistence Library via gradle

// annotation processor
annotationProcessor "com.abubusoft:kripton-processor:7.0.0"

// https://mvnrepository.com/artifact/com.abubusoft/kripton
implements "com.abubusoft:kripton-android-library:7.0.0"

Code configuration

Before use Kripton to persit on SQLite and Shared Preferences, an Android app have to initialize Kripton library. To do this, just add the following code to Application class (usually on method onCreate):

// set context for Kripton Library
KriptonLibrary.init(this);

Quickstart - Persistence on a SQLite database

Kripton uses the DAO pattern to approach the database management. In the DAO pattern there are:

  • A data model composed of simple POJO objects in Java world, and tables in the SQLite world.
  • Data Access Object interfaces that define how to access to the database
  • Data Access Object implementation that implements the DAO interfaces
  • A database that is composed of DAOs and data model.

Choose the right database

In version 7 Kripton you can choose to use plain SQLite databases or ciphered database through the SQLCipher database.

Use SQLite

To use simple SQLite database, simply add to project's dependencies the sqlite aar

implementation "androidx.sqlite:sqlite:2.1.0"

Use SQLcipher

To enable this feature, just include in your dependencies the sqlcipher aar:

implementation "net.zetetic:android-database-sqlcipher:4.3.0"

And use the KriptonSQLCipherHelperFactory to as factory in your DataSources:

KriptonSQLCipherHelperFactory factory = new KriptonSQLCipherHelperFactory(password.toCharArray());

BindAppDataSource.build(DataSourceOptions.builder()
        .populator(new AppPopulator())
        .openHelperFactory(factory)
        .build());

Model definition example

Kripton needs the developer defines the data model with @BindTable annotated java classes, the DAO’s interfaces with BindDao annotated Java interface and a data source (the database) by a BindDataSource annotated Java interface. At compile time, Kripton will generate all needed code to implements DAO interfaces and for managing data source.

Suppose that our app data model has a Person entity that need to be persisted on a SQLite databas. In the following example it is explained how to define an SQLite database with a person table, and a DAO interface with some methods to do CRUD operations (Create Read Update Delete). The data model:

@BindSqlType(name="persons")
public class Person{
  public long id;
  public String name;
  public String surname;
  public String email;
  public Date birthDate;
}

Just two things:

  • every SQLite table needs an id column of type Long or long. It’s a constraint that Kripton required for every table and it is a best practice for SQLite databases.
  • @BindSqlType is the annotation used to mark a data model that will be used in an SQLite database.

The DAO interface definition is:

@BindDao(Person.class)
public interface PersonDao {

  @BindSqlSelect(orderBy="name")
  List<Person> selectAll();

  @BindSqlSelect(jql="select * from person order by name")
  List<Person> selectTwo();

  @BindSqlSelect()
  List<Person> selectThree(@BindSqlDynamicOrderBy String orderBy);

  @BindSqlSelect(where = "id=${work.id}")
  List<E> selectById(@BindSqlParam("work") E bean);

  @BindSqlInsert
  void insert(Person bean);

  @BindSqlUpdate(where = "id=${work.id}")
  boolean update(@BindSqlParam("work") Person bean);
  
  @BindSqlDelete(where = "id=${work.id}")
  boolean delete(@BindSqlParam("work") Person bean);
}

The data source definition:

@BindDataSource(daoSet= { PersonDao.class }, fileName = "person.db", log=true)
public interface PersonDataSource {
}

When the project is compiled, Kripton annotation processor will generate for us the code that implements the data source defined by the data model, the DAO and data-source interfaces.

The need annotations to define a data source with Kripton are:

In the application, to use generated an implementation of data-source you can use code like this:

// typically Kripton library is done in Application#onCreate
KriptonLibrary.init(context);

// usage example 1: using a transaction
BindPersonDataSource.getInstance().execute(daoFactory -> {
    PersonDao dao=daoFactory.getPersonDao();
    dao.insert(person);
    ...
    return TransactionResult.COMMIT;
});

// usage example 2: using shared connection
BindPersonDataSource.getInstance().executeBatch(daoFactory -> {
    PersonDao dao=daoFactory.getPersonDao();
    dao.selectAll();
    ...

});

For a PersonDataSource interface, Kripton generates a BindPersonDataSource class that implements the data-source which allows to work in a thread-safe way and exposing all DAO defined in PersonDataSource interface. The generated data-source exposes some methods to work in a transaction mode and in shared connection mode.

Quickstart - data format and REST clients

Suppose that your application data model is composed by User entity so defined (getter and setter are omitted for simplicity):

@BindType
public class User {
    public long id;
    public String name;
    public String username; 
}

To store or read an instance of User on a file, you can simply write:

// HOW TO WRITE/READ ON A FILE IN JSON FORMAT
// define an object
User user=new User();
...
				
// WRITE ON A FILE				
BinderContext binder=KriptonBinder.jsonBind();
binder.parse(new File(...), user);
...

// DEFINE A PERSISTENCE BINDER
BinderContext binder=KriptonBinder.jsonBind();

// WRITE INTO A FILE				
binder.serialize(user, new File(..));

// READ FROM A FILE				
User newUser=binder.parse(new File(..), User.class);

To make same operation with different data format like XML, YAML, and so on just replace

BinderContext binder=KriptonBinder.jsonBind();

with

// XML binder
BinderContext binder=KriptonBinder.xmlBind();

// YAML binder
BinderContext binder=KriptonBinder.bind(BinderType.YAML);

// CBOR binder
BinderContext binder=KriptonBinder.bind(BinderType.CBOR);

// PROPERTY binder
BinderContext binder=KriptonBinder.bind(BinderType.PROPERTIES);

// SMILE binder
BinderContext binder=KriptonBinder.bind(BinderType.SMILE);

To integrate Kripton Persistence Library with Retrofit:

// Client definition
public interface QuickStartService {
  @GET("users")
  Call<List<User>> listUsers();	
}

// Retrofit initialization (with Kripton converter factory)
Retrofit retrofit = new Retrofit.Builder().baseUrl(...)
  .addConverterFactory(KriptonBinderConverterFactory.create())
  .build();

// Retrofit usage .. as usual.

To see how fast is Kripton to convert from/to JSON read this wiki page.

Quickstart - Persistence with Shared Preferences

To persist beans with SharedPreference, we need to define the class that contains properties that SharedPreference will persist.

Kritpon uses an annotation processor to generate boilerplate code necessary to interact with shared preferences.

Usage

Consider the follow bean definition:

@BindType
public class User  {
    public long id;
    public String email;
    public String name;
    public String surname;
    public String username;
}

A share preferences definition can be done with a simple class:

@BindSharedPreferences
public class SecurityPreferences {
  public User user;
}

The Kripton Annotation Processor will generate for us BindSecurityPreferences to work with shared preferences. In this way, after run the annotation processor, to work with shared preferences we will write:

final User bean=new User();
...
BindSecurityPreferences security=BindSecurityPreferences.getInstance();
security.edit().putUser(bean).commit();	

There some feature of generated shared preference that we want to underline:

  • BindSecurityPreferences derives from Shared Preference, so it inherit all its method and its "way of working".
  • BindSecurityPreferences is a singleton.
  • Shared Preferences can be managed with Live Data and Observable pattern (since version 4).
  • BindSecurityPreferences contains a Editor specialized to work with SecurityPreferences fields.

Build

To build entire library collections just download repository and launch from base directory

mvn clean install -Prelease

Supported platforms

There are two supported platforms: the android environment and generic Java environment. For each platform there is a version of library. Android platform already include a json library and xml parser library. Java JDK does not include a json library and have different xml parser libraries.

License

Copyright 2015-2020 Francesco Benincasa.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Bump junit from 4.12 to 4.13.1 in /kripton

    Bump junit from 4.12 to 4.13.1 in /kripton

    Bumps junit from 4.12 to 4.13.1.

    Release notes

    Sourced from junit's releases.

    JUnit 4.13.1

    Please refer to the release notes for details.

    JUnit 4.13

    Please refer to the release notes for details.

    JUnit 4.13 RC 2

    Please refer to the release notes for details.

    JUnit 4.13 RC 1

    Please refer to the release notes for details.

    JUnit 4.13 Beta 3

    Please refer to the release notes for details.

    JUnit 4.13 Beta 2

    Please refer to the release notes for details.

    JUnit 4.13 Beta 1

    Please refer to the release notes for details.

    Commits
    • 1b683f4 [maven-release-plugin] prepare release r4.13.1
    • ce6ce3a Draft 4.13.1 release notes
    • c29dd82 Change version to 4.13.1-SNAPSHOT
    • 1d17486 Add a link to assertThrows in exception testing
    • 543905d Use separate line for annotation in Javadoc
    • 510e906 Add sub headlines to class Javadoc
    • 610155b Merge pull request from GHSA-269g-pwp5-87pp
    • b6cfd1e Explicitly wrap float parameter for consistency (#1671)
    • a5d205c Fix GitHub link in FAQ (#1672)
    • 3a5c6b4 Deprecated since jdk9 replacing constructor instance of Double and Float (#1660)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 2
  • Bump junit from 4.12 to 4.13.1 in /kripton-orm

    Bump junit from 4.12 to 4.13.1 in /kripton-orm

    Bumps junit from 4.12 to 4.13.1.

    Release notes

    Sourced from junit's releases.

    JUnit 4.13.1

    Please refer to the release notes for details.

    JUnit 4.13

    Please refer to the release notes for details.

    JUnit 4.13 RC 2

    Please refer to the release notes for details.

    JUnit 4.13 RC 1

    Please refer to the release notes for details.

    JUnit 4.13 Beta 3

    Please refer to the release notes for details.

    JUnit 4.13 Beta 2

    Please refer to the release notes for details.

    JUnit 4.13 Beta 1

    Please refer to the release notes for details.

    Commits
    • 1b683f4 [maven-release-plugin] prepare release r4.13.1
    • ce6ce3a Draft 4.13.1 release notes
    • c29dd82 Change version to 4.13.1-SNAPSHOT
    • 1d17486 Add a link to assertThrows in exception testing
    • 543905d Use separate line for annotation in Javadoc
    • 510e906 Add sub headlines to class Javadoc
    • 610155b Merge pull request from GHSA-269g-pwp5-87pp
    • b6cfd1e Explicitly wrap float parameter for consistency (#1671)
    • a5d205c Fix GitHub link in FAQ (#1672)
    • 3a5c6b4 Deprecated since jdk9 replacing constructor instance of Double and Float (#1660)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 2
  • Generated content provider does not compile (updateWithOnConflict)

    Generated content provider does not compile (updateWithOnConflict)

    Let DAO method annotated with the following:

    @BindContentProviderEntry(path = "${pref.verticalId}")
       @BindSqlUpdate(conflictAlgorithm = ConflictAlgorithmType.IGNORE, where = "verticalId=${pref.verticalId}")
       int update(VerticalPref pref);
    
    

    The combination of conflictAlgorithm and where in the annotation @BindSqlUpdate generates a code with compilation error, as following (note the extra ')' before ", 4"):

    int result = database().updateWithOnConflict("vertical_pref", contentValues.values(), sqlWhereStatement, _contentValues.whereArgsAsArray()), 4);

    opened by ron-k 2
  • create datasource in writemode only and never close db

    create datasource in writemode only and never close db

    Nowaday datasources are opened in read or in write mode, to allow concurrency operation in read mode.

    It can be useful to enable a write-only mode. This mode can enable to avoid opening e closing db. The db will be opened at first time e will never close.

    enhancement orm module 
    opened by xcesco 1
  • Add support for Optional

    Add support for Optional

    For scalar, bean, byte[] can be usefull to include Optional Support. Collections does not need to be Optinalized.. due the fact they are always created in orm

    enhancement orm module 
    opened by xcesco 1
  • 'SupportSQLiteOpenHelper' ClassNotFoundException in compile time

    'SupportSQLiteOpenHelper' ClassNotFoundException in compile time

    Compilation of a project throws the above exception during annotation processing.

    I believe it is due to the fact the annotation processor does not include in its classpath the androidx.sqlite.db.SupportSQliteOpenHelper class.

    Environment

    Android Studio 4.1 com.android.tools.build:gradle:4.1.0 compileSdkVersion 30 buildToolsVersion "30.0.2"

    SupportSQLiteOpenHelper need to be included in the annotation processor library's classpath.

    bug 
    opened by xcesco 1
  • Allow in XML format parser to have sparse elements of a flat array

    Allow in XML format parser to have sparse elements of a flat array

    I decide to avoid to implement this feature because it will break the compatibility with JSON and other data format supported by Jackson. Better to allow in XML format to have elements of a flat array (the one with no tag for an array, but only for the array items). An example:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <containerBean>
      <item><name>ciuaua</name></item>
      <name>hello</name>
      <item><name>ciuaua</name></item>
    </containerBean>
    

    The new goal is that associated Java object can put in it list field item both elements. For the moment only the last will be captured.

    Originally posted by @xcesco in https://github.com/xcesco/kripton/issues/43#issuecomment-608533068

    bug file module 
    opened by xcesco 1
  • support for xml collection of element of different type

    support for xml collection of element of different type

    Support for xml collection of element of different type.

    I need to parse an XML with an array of element of different types. Will Kripton help me?

    Tests to do:

    • can not insert a type that is not specified with @BindXmlElements annotation
    • With @BindXmlElement it no allowed to use an element name used with another field
    • With @BindXmlElement it no allowed to use an element name used with another field annotated with @BindXmlElement
    • @BindXmlElement can be used only List or Set collection type fields.
    • type of the annotated @BindXmlElement element has to be a parent class of elements specified with annotations.
    enhancement file module 
    opened by xcesco 1
  • SQLCipherHelper need a check to avoid connection without password

    SQLCipherHelper need a check to avoid connection without password

    When I restart from Android Studio an application that uses SQLCipher database, it try to open it without password and so it deletes the database. Better to avoid database opening without a password. I will try to insert a flat like passwordIsRequired.

    bug enhancement orm module 
    opened by xcesco 1
  • Support for androidx.sqlite.db

    Support for androidx.sqlite.db

    With androidx packages, a new sqlite wrapper is coming: androidx.sqlite.db. We need to include its support. It's the way to support in the future other SQLite library implementation (SQLCypher in primis).

    enhancement orm module 
    opened by xcesco 1
  • Wrong binding on

    Wrong binding on

    Model:

    @BindType
    public class Document {
      public long id;
      public String fileName;
    }
    
    @BindDao(Document.class)
    public interface DaoDocument {	
      @BindSqlSelect(fields="fileName",where="fileName like :input")
      Set<String> findByFileName(String input);
    	
      @BindSqlInsert
      void insert(String fileName);
    
      @BindSqlSelect
      List<Document> selectAll();
    }
    

    When I try to invoke findByFilename I receive the following error:

    com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'sorry': was expecting ('true', 'false' or 'null')
    
    opened by xcesco 1
Releases(v8.1.0-rc.1)
  • v8.1.0-rc.1(Sep 30, 2022)

  • v8.0.0(Sep 28, 2022)

  • v8.0.0-rc.6(Jun 25, 2022)

  • v8.0.0-rc.4(May 12, 2022)

  • v7.0.0-rc.7(Sep 29, 2020)

  • v6.0.0(Sep 22, 2019)

        Release Notes - Kripton Persistence Library - Version 6.0.0
    

    Bug

    • [KRIPTON-294] - parentEntity does not work with id with alias
    • [KRIPTON-301] - Sometimes java.lang.IllegalStateException: attempt to re-open an already-closed object #14
    • [KRIPTON-302] - Rename DateMillisecondsTypeAdapter in DateTime2LongTypeAdapter and DateMillisecondsTypeAdapter into Date2LongTypeAdapter #13
    • [KRIPTON-303] - Table alias must be checked
    • [KRIPTON-304] - Logger message must handle null message #11
    • [KRIPTON-309] - Custom bean does not match correctly fields when custom bean has less field than original one
    • [KRIPTON-312] - Improve multithread connection management.
    • [KRIPTON-314] - Some problems on multithread usage.
    • [KRIPTON-315] - Custom bean (immutable or not) used in SQL query does not have to contains id field #20
    • [KRIPTON-317] - Wrong binding on
    • [KRIPTON-322] - Generated content provider does not compile (updateWithOnConflict) #23
    • [KRIPTON-324] - Wrong binding on
    • [KRIPTON-328] - com.abubusoft.kripton.processor.exceptions.UnsupportedFieldTypeException: Unsupported type 'java.lang.Object' is used #18

    Improvement

    • [KRIPTON-298] - Improved compatibility with JetPack migration
    • [KRIPTON-300] - Add some junit test for annotation processor
    • [KRIPTON-305] - add registryChange for force live data invalidation on specific dao during transaction, batch operations and normal operation.
    • [KRIPTON-306] - Add printStackTrace on Exception during json managed field persistence operations
    • [KRIPTON-308] - Table alias must be checked to avoid duplicates
    • [KRIPTON-313] - Kripton Converter must throws an exception if something went wrong
    • [KRIPTON-316] - Update Jackson to version 2.9.6
    • [KRIPTON-319] - Custom bean (immutable or not) used in SQL query does not have to contains id field
    • [KRIPTON-320] - check on column name and table names: avoid sql keywords
    • [KRIPTON-326] - Custom bean (immutable or not) used in SQL query does not have to contains id field #20
    • [KRIPTON-327] - check on column name "order" and other SQL keywords: must be avoided #19

    New Feature

    • [KRIPTON-297] - Add total Elements to paged result
    • [KRIPTON-318] - Add "kripton.log" as Annotation Processor parameter
    • [KRIPTON-325] - Add "kripton.log" as Annotation Processor parameter #21
    • [KRIPTON-329] - Content Provider: static method support for Content Provider generation

    Task

    • [KRIPTON-299] - Retrofit update to 2.5.0 vesrion
    • [KRIPTON-307] - Rename DateMillisecondsTypeAdapter in DateTime2LongTypeAdapter and DateMillisecondsTypeAdapter into Date2LongTypeAdapter
    • [KRIPTON-310] - [BREAKING CHANGE] Change Generated Asynctask interface: removed throws Throwable from onExecute method
    • [KRIPTON-311] - [BREAKING CHANGE] Generated Asynctask # onExecute method does not open connection automatically anymore
    • [KRIPTON-321] - [BREAKING] Change @BindTransaction into @BindSqlTransaction
    • [KRIPTON-323] - Add java.version support to java8 for sqlite-test-library
    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-rc.7(May 22, 2019)

    Release Notes - Version 6.0.0

    Bug

    • [KRIPTON-294] - parentEntity does not work with id with alias
    • [KRIPTON-301] - Sometimes java.lang.IllegalStateException: attempt to re-open an already-closed object #14
    • [KRIPTON-302] - Rename DateMillisecondsTypeAdapter in DateTime2LongTypeAdapter and DateMillisecondsTypeAdapter into Date2LongTypeAdapter #13
    • [KRIPTON-303] - Table alias must be checked
    • [KRIPTON-304] - Logger message must handle null message #11
    • [KRIPTON-309] - Custom bean does not match correctly fields when custom bean has less field than original one
    • [KRIPTON-312] - Improve multithread connection management.
    • [KRIPTON-314] - Some problems on multithread usage.
    • [KRIPTON-315] - Custom bean (immutable or not) used in SQL query does not have to contains id field #20
    • [KRIPTON-317] - Wrong binding on
    • [KRIPTON-322] - Generated content provider does not compile (updateWithOnConflict) #23
    • [KRIPTON-324] - Wrong binding on
    • [KRIPTON-328] - com.abubusoft.kripton.processor.exceptions.UnsupportedFieldTypeException: Unsupported type 'java.lang.Object' is used #18

    Improvement

    • [KRIPTON-298] - Improved compatibility with JetPack migration
    • [KRIPTON-300] - Add some junit test for annotation processor
    • [KRIPTON-305] - add registryChange for force live data invalidation on specific dao during transaction, batch operations and normal operation.
    • [KRIPTON-306] - Add printStackTrace on Exception during json managed field persistence operations
    • [KRIPTON-308] - Table alias must be checked to avoid duplicates
    • [KRIPTON-313] - Kripton Converter must throws an exception if something went wrong
    • [KRIPTON-316] - Update Jackson to version 2.9.6
    • [KRIPTON-319] - Custom bean (immutable or not) used in SQL query does not have to contains id field
    • [KRIPTON-320] - check on column name and table names: avoid sql keywords
    • [KRIPTON-326] - Custom bean (immutable or not) used in SQL query does not have to contains id field #20
    • [KRIPTON-327] - check on column name "order" and other SQL keywords: must be avoided #19

    New Feature

    • [KRIPTON-297] - Add total Elements to paged result
    • [KRIPTON-318] - Add "kripton.log" as Annotation Processor parameter
    • [KRIPTON-325] - Add "kripton.log" as Annotation Processor parameter #21

    Task

    • [KRIPTON-299] - Retrofit update to 2.5.0 vesrion
    • [KRIPTON-307] - Rename DateMillisecondsTypeAdapter in DateTime2LongTypeAdapter and DateMillisecondsTypeAdapter into Date2LongTypeAdapter
    • [KRIPTON-310] - [BREAKING CHANGE] Change Generated Asynctask interface: removed throws Throwable from onExecute method
    • [KRIPTON-311] - [BREAKING CHANGE] Generated Asynctask # onExecute method does not open connection automatically anymore
    • [KRIPTON-321] - [BREAKING] Change @BindTransaction into @BindSqlTransaction
    • [KRIPTON-323] - Add java.version support to java8 for sqlite-test-library
    Source code(tar.gz)
    Source code(zip)
  • v5.0.0(Sep 25, 2018)

    Bug

    [KRIPTON-276] - Improved support for SortedMap and SortedSet

    [KRIPTON-277] - Type adapter used in DAO's method have to be checked [KRIPTON-279] - ORM: global type adapter does not work

    Improvement

    [KRIPTON-262] - Kotlin class hierarchy: now property from parent class is correctly managed. Constraint: parent class must have a Kripton Annotation

    [KRIPTON-263] - Java: property from parent class now can have a protected backend field (until now it can be only protected or public) [KRIPTON-267] - ORM: in a table column order is: first PRIMARY KEY, then other column ordered by field name [KRIPTON-268] - ORM: table order: table must be order by default ordered with its name. Mutual dependencies can change default order. [KRIPTON-271] - DateUtils have to work with System TimeZone [KRIPTON-272] - Persistent on file: Support for Immutable POJO [KRIPTON-278] - DateUtils now works with system TimeZone [KRIPTON-282] - SQLite: multi-column index generates unique constraint too [KRIPTON-283] - SQLite: add DateMillisecondsTypeAdapter and DateTimeMillisecondsTypeAdapter to manage util.Date and sql.Date [KRIPTON-287] - SQLite: PK is now NOT NULL

    New Feature

    [KRIPTON-264] - parameter in query string can be ${placeHolder} or :{placeHolder} or :placeHolder

    [KRIPTON-265] - parameter in content provider URL can be ${placeHolder} or :{placeHolder} or :placeHolder [KRIPTON-266] - PK now can be String type too [KRIPTON-269] - Long/long Primary Key now can be UNMANAGED [KRIPTON-270] - Manage spread parameter for "in" and "not in" where condition [KRIPTON-273] - Persistent by REST service: Support for Immutable POJO [KRIPTON-274] - Persistent on SQLite: Support for Immutable POJO [KRIPTON-275] - Persistent on Shared-Preference: Support for Immutable POJO [KRIPTON-284] - SQLite: data source have executeAsync and executeBatchAsync [KRIPTON-285] - SQLite: paginated result has now method getCurrentPage() [KRIPTON-286] - SQLite: DAO's method can return any SQL-type that is not included in data source definition [KRIPTON-288] - Add PagedLiveData [KRIPTON-292] - @BindTransition for data-source

    Task

    [KRIPTON-280] - update Jackson dependencies to 2.9.6

    [KRIPTON-281] - update Rx dependency to 2.1.17 [KRIPTON-290] - [BREAK] Minimum JDK 1.8 [KRIPTON-293] - [BREAK] SQLPopulator#execute: remove SQLDatabase parameter

    Source code(tar.gz)
    Source code(zip)
  • v4.0.0(Jun 10, 2018)

        Release Notes - Kripton Persistence Library - Version 4.0.0
    

    Bug

    • [KRIPTON-230] - Insert from Select does not work
    • [KRIPTON-248] - Generate Async task had some problem during data source close operation
    • [KRIPTON-249] - DYNAMIC_WHERE did not work on explicit SELECT JQL queries

    Improvement

    • [KRIPTON-160] - Add capability of add DYNAMIC_WHERE in extended query type (UPDATE-DELETE)
    • [KRIPTON-161] - Add capability of add DYNAMIC_ORDER in extended query type.
    • [KRIPTON-229] - Dao Subject: avoid to fire events if no elements is modified
    • [KRIPTON-233] - Modularization of Android Library
    • [KRIPTON-241] - ORM: index refactoring: introducing @BindIndex
    • [KRIPTON-247] - [BREAK COMPATIBILITY] @BindColumn renamed in @BindSqlColumn
    • [KRIPTON-252] - SQLite Test Suite refactoring
    • [KRIPTON-253] - [BREAK COMPATIBILITY] @BindTable renamed in @BindSqlType
    • [KRIPTON-259] - Supports for Android Jet Pack with kripton.androidx annotation processor parameter

    New Feature

    • [KRIPTON-131] - Add to Retrofit integration, capability to decide which data format choose to work with REST service
    • [KRIPTON-228] - Add LiveData Support
    • [KRIPTON-234] - Define @BindDataSourceOptions to configure DataSource
    • [KRIPTON-237] - Add @BindPreferenceAdapter
    • [KRIPTON-238] - Add global SQLiteTypeAdapter to data source
    • [KRIPTON-239] - add capability to specify for a column the type affinity
    • [KRIPTON-240] - Add @BindSqlRelation to support entity relationship
    • [KRIPTON-246] - Add @BindSqlChildSelect to support child select in select
    • [KRIPTON-250] - Add populator to SQLiteUpdateTestDatabase.builder
    • [KRIPTON-251] - Add simply support for xml namespace
    • [KRIPTON-254] - Add annotation processor options: kripton.schemaLocation
    • [KRIPTON-258] - Support for RX for Shared Preferences
    • [KRIPTON-260] - Shared Preference RX supports
    • [KRIPTON-261] - Shared Preference LiveData support

    Task

    • [KRIPTON-227] - Version alignment with maven version
    • [KRIPTON-231] - Remove SQLContext interface to AbstractDataSource
    • [KRIPTON-235] - rename BindTypeAdapter to TypeAdapter
    • [KRIPTON-236] - rename BindSqlTypeAdapter into SqlTypeAdapter
    • [KRIPTON-242] - ORM: removed generated build() method in datasource: it does not need anymore
    • [KRIPTON-243] - @BindColumn#foreignKey renamed in parentEntity
    • [KRIPTON-244] - build and instance methods improvement: remove sync and implementation of inner sync
    • [KRIPTON-245] - @BindColumn#foreignKey renamed in parentEntity
    • [KRIPTON-255] - [BREAK COMPATIBILITY] refactoring DataSource.instance() -> getInstance()
    • [KRIPTON-256] - [BREAK COMPATIBILITY] refactoring Dao.subject() -> getSubject()
    • [KRIPTON-257] - [BREAK COMPATIBILITY] KriptonLibrary.context() -> getContext()
    Source code(tar.gz)
    Source code(zip)
  • v3.5.0(Mar 2, 2018)

        Release Notes - Kripton Persistence Library - Version 3.5.0
    

    Bug

    • [KRIPTON-209] - Use generated many 2 many entity in jql causes error
    • [KRIPTON-220] - If a field is decorated with @BindSqlTypeAdapter, @BindTypeAdapter is not necessary
    • [KRIPTON-222] - ORM: a SQLiteTypeAdapter managed field never receive null value into generated method

    Improvement

    • [KRIPTON-213] - Content provider: generate uri values to access methods
    • [KRIPTON-214] - Datasource update task can be defined in @BindDataSource annotation
    • [KRIPTON-217] - SQLite populator: let populator definition more simpler with @BindDataSource#populator and DataSourceOptions.populator
    • [KRIPTON-226] - Log of byte[] parameter: display its hexadecimal rapresentation

    New Feature

    • [KRIPTON-215] - Add @BindDatasource#inMemory flag to use in memory database
    • [KRIPTON-218] - Add DataSource classes isJustCreated flag to check if datasource is just created
    • [KRIPTON-219] - @BindDataSource: add capability to define update task with annotation
    • [KRIPTON-223] - Every datasource expose its table names with Table[] getTables()
    • [KRIPTON-224] - Every table expose its column names with String[] columns() method

    Task

    • [KRIPTON-210] - remove @BindDaoMany2Many attribute onlyFields(): unsused
    • [KRIPTON-211] - @BindDaoMany2Many: rename generatedMethods to methods
    • [KRIPTON-221] - Generated Content Provider: improved javadoc generation for methods: query, insert, update, delete
    • [KRIPTON-225] - Improve value insertion into contentValue
    Source code(tar.gz)
    Source code(zip)
  • v3.4.1(Feb 20, 2018)

  • v3.4.0(Feb 20, 2018)

  • v3.3.0(Feb 11, 2018)

  • v3.2.0(Jan 31, 2018)

  • v3.1.0(Dec 11, 2017)

    Kripton Persistence Library - Version 3.1.0

    Bug

    • [KRIPTON-198] - @BindPreference does not use name annotation.

    Improvement

    • [KRIPTON-199] - SQLite ORM: notify if @BindInsert method does not have any parameter

    New Feature

    • [KRIPTON-197] - Shared Preference: Add refresh() method to be sure to load latest data from shared preference

    Task

    • [KRIPTON-200] - update jackson dependencies to version 2.9.3
    Source code(tar.gz)
    Source code(zip)
  • v3.0.2(Nov 27, 2017)

  • v3.0.1(Nov 25, 2017)

  • v3.0.0(Nov 24, 2017)

        Release Notes - Kripton Persistence Library - Version 3.0.0
    

    Sub-task

    • [KRIPTON-174] - Add @BindMany2Many
    • [KRIPTON-175] - SQLite ORM:@BindDao.value is now optional for Many 2 Many Dao

    Bug

    • [KRIPTON-184] - SQLite ORM: Datasource can not be defined in other package than same of DAOs

    Improvement

    • [KRIPTON-177] - SQLite ORM:Improve speed
    • [KRIPTON-178] - SQLite ORM: InvalidMethodSignException on invalid return type must be clear message
    • [KRIPTON-185] - SQLite ORM: Add display info when schema file is generated
    • [KRIPTON-186] - SQLite ORM: enhancement on SQL grammar check at compile time
    • [KRIPTON-188] - SQLite ORM:[BREAKING COMPATIBILTY CHANGE] Type Adapter change definition: removed dataType attribute
    • [KRIPTON-189] - SQLite ORM:[BREAKING COMPATIBILTY CHANGE] Transaction can return TransationResult.COMMIT or ROLLBACK, just to add clearity to method result.
    • [KRIPTON-191] - SQLite: add capability to data source to execute list of commands without transaction

    New Feature

    • [KRIPTON-124] - SQLite ORM: Add to @BindSqlParam capability to convert value into string
    • [KRIPTON-165] - SQLite ORM: SQLite type adapter
    • [KRIPTON-167] - SQLite ORM: Add @BindSqlParam.adapter
    • [KRIPTON-169] - SQLite ORM: Add support for java.sql.Date
    • [KRIPTON-172] - SQLite ORM:Simplify generation of Many 2 Many Relationship
    • [KRIPTON-173] - SQLite ORM: SQLite ORM:Simplify generation of Many 2 Many Relationship
    • [KRIPTON-176] - SQLite ORM: Support for ON DELETE and ON UPDATE action for foreign keys
    • [KRIPTON-190] - SQLite ORM:Add RX Support: transaction and batch can be managed as Observable, Single, Flowable, Maybe
    • [KRIPTON-193] - SQLite ORM: [BREAKING COMPATIBILTY CHANGE] Introduce batch operation with managed connection

    Task

    • [KRIPTON-166] - SQLite ORM:@BindSqlParam.value is now optional
    • [KRIPTON-168] - SQLite ORM: generated datasource: make build method synchronized
    • [KRIPTON-170] - SQLite ORM: UnknownPropertyInJQLException: better description of exception
    • [KRIPTON-171] - UnknownClassInJQLException: better description of exception
    • [KRIPTON-180] - SQLite ORM: SQLite type adapter: add more tests
    • [KRIPTON-181] - SQLite ORM: @BindTypeAdapter: remove dataType attribute
    • [KRIPTON-182] - SQLite ORM: @BindTypeAdapter: remove dataType attribute
    • [KRIPTON-183] - SQLite ORM:@BindSQLTypeAdapter: remove dataType attribute
    • [KRIPTON-192] - SQLite ORM:[BREAKING COMPATIBILTY CHANGE] @BindDataSource.generateLog generateCursorWrapper, generateAsyncTask , generateSchema will renamed in log cursorWrapper, asyncTask , schema
    • [KRIPTON-194] - SQLite ORM: transaction and batch does open and close database connection only if needed.
    Source code(tar.gz)
    Source code(zip)
  • v2.0.2(Sep 6, 2017)

    Release Notes - Kripton Persistence Library - Version 2.0.2

    Bug

    • [KRIPTON-163] - JQL-SELECT does not work @BindSqlSelect(jql="select * from CollegeStudent where firstName like ${firstName} || '%' ")
    • [KRIPTON-164] - JQL-INSERT included fields problem

    Task

    • [KRIPTON-162] - Update fasterXML and retrofit dependencies
    Source code(tar.gz)
    Source code(zip)
  • v2.0.1(Sep 4, 2017)

  • v2.0.0(Aug 16, 2017)

    Release Notes - Kripton Library - Version 2.0.0

    Sub-task

    • [KRIPTON-126] - Define Content provider URL ANTLR grammar
    • [KRIPTON-134] - Generate INSERT for Content Provider starting from INSERT definition of DAO
    • [KRIPTON-138] - Generate DELETE for Content Provider starting from DELETE definition of DAO
    • [KRIPTON-139] - Generate UPDATE for Content Provider starting from UPDATE definition of DAO
    • [KRIPTON-140] - Generate SELECT for Content Provider starting from SELECT definition of DAO
    • [KRIPTON-141] - Generate ContentType support
    • [KRIPTON-146] - INSERT-FROM-SELECT raw support
    • [KRIPTON-147] - INSERT-BEAN with JQL
    • [KRIPTON-149] - UPDATE-SELECT support with JQL

    Bug

    Improvement

    • [KRIPTON-118] - Check of SQL generate on annotation processor compile time
    • [KRIPTON-120] - Change @BindSqlWhere to @BindSqlDynamicWhere
    • [KRIPTON-121] - Add @BindSqlDynamicWhereArgs

    New Feature

    Task

    • [KRIPTON-35] - Generate ContentProvider
    • [KRIPTON-57] - Support enum to string or to int
    • [KRIPTON-113] - Change name of parameter of SimpleTransaction for DataSource
    • [KRIPTON-114] - Change name of parameter of SimpleTransaction for DataSource
    • [KRIPTON-119] - update jackson & retrofit dependencies
    • [KRIPTON-122] - Change @BindSqlOrderBy to @BindSqlDynamicOrderBy
    • [KRIPTON-123] - Internal refactoring using ANTLR4
    • [KRIPTON-125] - Use ANTLR4 grammar to check Content Provider URL
    • [KRIPTON-128] - Rename value attribute in @BindSqlSelect, @BindSqlInsert, @BindSqlDelete in fields
    • [KRIPTON-132] - Rename attributes of @BindDataSource: asyncTask, cursor, log in generateAsyncTask, generateCursor, generateLog
    • [KRIPTON-142] - remove from binder context, exposed internal methods
    • [KRIPTON-153] - Check javadoc production
    Source code(tar.gz)
    Source code(zip)
  • v1.6.1(Mar 5, 2017)

  • v1.6.0(Feb 11, 2017)

    Bug

    • [KRIPTON-96] - SQLite: use % symbol in where condition
    • [KRIPTON-101] - SQLite: manage null parameter
    • [KRIPTON-102] - SQLite: RAW UPDATE does not signal update without parameter
    • [KRIPTON-106] - BindType: support for hierarchy with generic

    Improvement

    • [KRIPTON-97] - SQLite: improve support to generic SQL
    • [KRIPTON-98] - SQLite: add support to INSERT OR UPDATE/REPLACE/IGNORE enhancement
    • [KRIPTON-99] - SQLite: add INDEX support
    • [KRIPTON-100] - SQLite: remove default where condition 1=1
    • [KRIPTON-104] - DataSource implementation refactoring
    • [KRIPTON-105] - AsyncTask refactoring

    New Feature

    • [KRIPTON-93] - Support for INSERT or UPDATE/REPLACE/IGNORE etc
    • [KRIPTON-94] - Improve supporto for generic SQL
    • [KRIPTON-95] - SQLite: study how implements dynamic queries enhancement
    • [KRIPTON-103] - SQLite: support select result limit
    • [KRIPTON-107] - Introduce generic map read directly from binder context

    Task

    Source code(tar.gz)
    Source code(zip)
  • v1.5.0(Jan 18, 2017)

    Bug

    • [KRIPTON-88] - Fix on foreign key generator
    • [KRIPTON-89] - SQL Log erraneous: UPDATE bean_a_5 SET bean_a2_id='1', value_string='hello' WHERE valueString=hello

    New Feature

    • [KRIPTON-9] - Binding on Java Property files
    • [KRIPTON-21] - YAML file format
    • [KRIPTON-71] - Make parser xml/jackson - list types
    • [KRIPTON-78] - JavaProps: null value in collections, array and map are rappresented by "null" string
    • [KRIPTON-87] - Add TypeAdapter attribute to @Bind
    • [KRIPTON-91] - Detect table circular dependency
    • [KRIPTON-92] - @BindSqlInsert: attribute includePrimaryKey

    Task

    • [KRIPTON-25] - Stream parser/serializer for xml/json/propertis/yaml format
    • [KRIPTON-70] - Study about fasterxml-jackson
    • [KRIPTON-72] - compile time support for set of entity
    • [KRIPTON-73] - compile time support for array of entity (byte excluded)
    • [KRIPTON-74] - compile time support for map of entity
    • [KRIPTON-75] - compile time support for byte array
    • [KRIPTON-76] - compile time support for xml attribute
    • [KRIPTON-77] - improve check
    • [KRIPTON-79] - Remove old bind compiled system and use binder system 2
    • [KRIPTON-80] - Add support to Collection serialization and parser
    • [KRIPTON-81] - Add more test to increment coverage code
    • [KRIPTON-82] - Add JavaProperties format support
    • [KRIPTON-83] - Add CBOR format support
    • [KRIPTON-84] - SQLite: convert all field management to compile time
    • [KRIPTON-86] - Improve test on Annotation Processor Exceptions
    • [KRIPTON-90] - enable foreignKey support
    Source code(tar.gz)
    Source code(zip)
  • v1.4.0(Nov 10, 2016)

  • v1.3.0(Nov 7, 2016)

    Release Notes - Kripton Library - Version 1.3.0

    Bug

    Improvement

    • [KRIPTON-60] - Add more test to supported field type

    New Feature

    • [KRIPTON-59] - Add JSon read/write array directly
    • [KRIPTON-61] - Add enable attribute to @BindColumn, @BindXml, @BindJson, @BindPreference

    Task

    • [KRIPTON-29] - Manage composed attributes
    • [KRIPTON-62] - Enable Set support in SQlite and SharedPreference
    • [KRIPTON-63] - Enable Map support in SQlite and SharedPreference
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Mar 23, 2015)

Owner
xcesco
xcesco
Active record style SQLite persistence for Android

ActiveAndroid ActiveAndroid is an active record style ORM (object relational mapper). What does that mean exactly? Well, ActiveAndroid allows you to s

Michael Pardo 4.7k Dec 29, 2022
requery - modern SQL based query & persistence for Java / Kotlin / Android

A light but powerful object mapping and SQL generator for Java/Kotlin/Android with RxJava and Java 8 support. Easily map to or create databases, perfo

requery 3.1k Dec 29, 2022
ORMDroid is a simple ORM persistence framework for your Android applications.

ORMDroid is a simple ORM persistence framework for your Android applications, providing an easy to use, almost-zero-config way to handle model persist

Ross Bamford 87 Nov 10, 2022
lightweight and minimalist ORM for Java/Android. works with SQLite & MySQL. (not actively maintained)

Description ORMAN is an minimalistic and lightweight ORM framework for Java which can handle your common database usage without writing SQL and strugg

Ahmet Alp Balkan 246 Nov 20, 2022
lightweight and minimalist ORM for Java/Android. works with SQLite & MySQL. (not actively maintained)

Description ORMAN is an minimalistic and lightweight ORM framework for Java which can handle your common database usage without writing SQL and strugg

Ahmet Alp Balkan 246 Nov 20, 2022
An Android library that makes developers use SQLite database extremely easy.

LitePal for Android 中文文档 LitePal is an open source Android library that allows developers to use SQLite database extremely easy. You can finish most o

Lin Guo 7.9k Dec 31, 2022
SquiDB is a SQLite database library for Android and iOS

Most ongoing development is currently taking place on the dev_4.0 branch. Click here to see the latest changes and try out the 4.0 beta. Introducing S

Yahoo 1.3k Dec 26, 2022
An Android library that makes developers use SQLite database extremely easy.

LitePal for Android 中文文档 LitePal is an open source Android library that allows developers to use SQLite database extremely easy. You can finish most o

Lin Guo 7.9k Jan 4, 2023
greenDAO is a light & fast ORM solution for Android that maps objects to SQLite databases.

Check out ObjectBox Check out our new mobile database ObjectBox (GitHub repo). ObjectBox is a superfast object-oriented database with strong relation

Markus Junginger 12.6k Jan 3, 2023
Android SQLite API based on SQLCipher

Download Source and Binaries The latest AAR binary package information can be here, the source can be found here. Compatibility SQLCipher for Android

SQLCipher 2.6k Dec 31, 2022
Extended SQLite functionality for Android

sqlite-provider A simplification of database access for Android. Description sqlite-provider implements a ContentProvider for you that allows database

Novoda 308 Nov 20, 2022
Compile time processed, annotation driven, no reflection SQLite database layer for Android

SqliteMagic Simple yet powerful SQLite database layer for Android that makes database handling feel like magic. Overview: Simple, intuitive & typesafe

Siim Kinks 118 Dec 22, 2022
android 数据库框架,sqlite database

DBExecutor 主要的功能 1.使用了读写锁,支持多线程操作数据。 2.支持事务 3.支持ORM 4.缓存Sql,缓存表结构 这个类库主要用于android 数据库操作。 始终围绕着一个类对应一个表的概念。 只要创建一个实体类,就不用当心它怎么存储在数据库中,不用重新写增删改查的代码。基本的功

null 77 May 31, 2021
AndroidQuery is an Android ORM for SQLite and ContentProvider which focuses on easy of use and performances thanks to annotation processing and code generation

WARNING: now that Room is out, I no longer maintain that library. If you need a library to easy access to default android ContentProvider, I would may

Frédéric Julian 19 Dec 11, 2021
LiteOrm is a fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line of code efficiently.

#LiteOrm:Android高性能数据库框架 A fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line

马天宇 1.5k Nov 19, 2022
Extended SQLite functionality for Android

sqlite-provider A simplification of database access for Android. Description sqlite-provider implements a ContentProvider for you that allows database

Novoda 308 Nov 20, 2022
Realm is a mobile database: a replacement for SQLite & ORMs

Realm is a mobile database that runs directly inside phones, tablets or wearables. This repository holds the source code for the Java version of Realm

Realm 11.4k Jan 2, 2023
Exercicio praticando o SQLite, Room e Flow

Bus Scheduler App This folder contains the source code for the Bus Scheduler app codelab. Introduction The Bus Scheduler app displays a list of bus st

Lucas Caetano 0 Nov 26, 2021
An Android helper class to manage database creation and version management using an application's raw asset files

THIS PROJECT IS NO LONGER MAINTAINED Android SQLiteAssetHelper An Android helper class to manage database creation and version management using an app

Jeff Gilfelt 2.2k Dec 23, 2022