Note, this is a work in progress
This is a python module which generates Android classes. It is most useful for creating an initial database and contentprovider for a project.
I plan on adding all necessary classes for a database with a contentprovider to start with. More types of classes might follow as I see a need for them.
The database structure is basically the same as the one I present in my tutorial.
Please see sample.py for an example of how to generate all the database files and the sample project in /sample/ where they are used. The sample is a modified version of the tutorial project mentioned above so check that out for a preview of the app itself. sample_with_triggers.py shows a simple example where a database trigger is defined as well.
An example generation can be seen below where quite a simple table is created and then a java OrmClass is generated.
from AndroidCodeGenerator.db_table import Table, Column, ForeignKey, Unique from AndroidCodeGenerator.dbitem import DBItem t = Table('Album').add_cols(Column('albumname').text.not_null.default("''"), \ Column('artistname').text.not_null)\ .add_constraints(ForeignKey('artistname').references('artist', 'name')\ .on_delete_cascade,\ Unique('albumname').on_conflict_replace) print(DBItem(t, pkg="com.example.appname.database"))
Result:
package com.example.appname.database; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; /** * Represents Album in the database. * */ public class AlbumItem extends DBItem { public static final String TABLE_NAME = "Album"; public static Uri URI() { return Uri.withAppendedPath( Uri.parse(ItemProvider.SCHEME + ItemProvider.AUTHORITY), TABLE_NAME); } // Column names public static final String COL_ID = "_id"; public static final String COL_ALBUMNAME = "albumname"; public static final String COL_ARTISTNAME = "artistname"; // For database projection so order is consistent public static final String[] FIELDS = { COL_ID, COL_ALBUMNAME, COL_ARTISTNAME }; public long _id = -1; public String albumname = ""; public String artistname; public static final int BASEURICODE = 3993119; public static final int BASEITEMCODE = 1102568; public static void addMatcherUris(UriMatcher sURIMatcher) { sURIMatcher.addURI(ItemProvider.AUTHORITY, TABLE_NAME, BASEURICODE); sURIMatcher.addURI(ItemProvider.AUTHORITY, TABLE_NAME + "/#", BASEITEMCODE); } public static final String TYPE_DIR = "vnd.android.cursor.dir/vnd.example." + TABLE_NAME; public static final String TYPE_ITEM = "vnd.android.cursor.item/vnd.example." + TABLE_NAME; public AlbumItem() { super(); } public AlbumItem(final Cursor cursor) { super(); // Projection expected to match FIELDS array this._id = cursor.getLong(0); this.albumname = cursor.getString(1); this.artistname = cursor.getString(2); } public ContentValues getContent() { ContentValues values = new ContentValues(); values.put(COL_ALBUMNAME, albumname); values.put(COL_ARTISTNAME, artistname); return values; } public String getTableName() { return TABLE_NAME; } public String[] getFields() { return FIELDS; } public long getId() { return _id; } public void setId(final long id) { _id = id; } public static final String CREATE_TABLE = "CREATE TABLE Album" +" (_id INTEGER PRIMARY KEY," +" albumname TEXT NOT NULL DEFAULT ''," +" artistname TEXT NOT NULL", +"" +" FOREIGN KEY (artistname) REFERENCES artist(name) ON DELETE CASCADE," +" UNIQUE (albumname) ON CONFLICT REPLACE)"; }
The program can generate the java files directly, as follows:
"""Generate a sample project""" from AndroidCodeGenerator.generator import Generator from AndroidCodeGenerator.db_table import Table, Column, ForeignKey, Unique persons = Table('Person').cols(Column('firstname').text.not_null.default("''"),\ Column('lastname').text.not_null.default("''"),\ Column('bio').text.not_null.default("''")) g = Generator(path='./sample/src/com/example/appname/database/') g.add_tables(persons) g.write()