/AndroidCodeGenerator

This is a python module which generates Android classes. It is most useful for creating an initial database and contentprovider for a project.

Primary LanguagePythonGNU General Public License v2.0GPL-2.0

AndroidCodeGenerator

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()