Java classes with abstract interface layers to provide a simple, easy-to-use Java interface to the NDK library (may be adapted for other Java environments).
With a simple test Android app included.
Based on: liteglue / Android-sqlite-connector
by Christopher J. Brody aka Chris Brody mailto: [email protected]
with some complex API response type enhancements by Luis Silva of OutSystems (luis dot silva at outsystems dot com)
License: UNLICENSE (public domain).
TBD
Android NDK library JAR build, from this for example: brodybits / android-sqlite-ndk-native-driver
TBD
Include the following in your libs directory:
- NDK JAR library
sqlite-native-ndk-connector.jar, which is built by simply issuing themakecommand in this project
There is a simple test project in the Android-SQLiteConnectorTest subdirectory. To test:
- Use the
makecommand to build the JAR - Build the NDK JAR
cd Android-SQLiteConnectorTest- Install the JAR files into the
libssubdirectory ofAndroid-SQLiteConnectorTest - Use a tool such as Android Studio to build and run (import is needed for newer versions of Android Studio)
IMPORTANT: Most of the methods described here will throw java.sql.SQLException if the sqlite library reports an error or if they detect a problem with the usage.
Import io.liteglue package:
import io.liteglue.*;Get a SQLiteConnector (factory) instance:
SQLiteConnector myconnector = new SQLiteConnector();File dbfile = new File(getFilesDir(), "my.db");
SQLiteConnection mydbc = myconnector.newSQLiteConnection(dbfile.getAbsolutePath(),
SQLiteOpenFlags.READWRITE | SQLiteOpenFlags.CREATE);SQLiteStatement mystatement = mydbc.prepareStatement("CREATE TABLE IF NOT EXISTS mytable (text1 TEXT, num1 INTEGER, num2 INTEGER, real1 REAL)");
mystatement.step();
mystatement.dispose();IMPORTANT: Whenever SQLiteConnection.prepareStatement() successfully returns a SQLiteStatement, it must be cleaned up using its dispose() method.
SQLiteStatement mystatement = mydbc.prepareStatement("INSERT INTO mytable (text1, num1, num2, real1) VALUES (?,?,?,?)");
mystatement.bindTextNativeString(1, "test");
mystatement.bindInteger(2, 10100);
mystatement.bindLong(3, 0x1230000abcdL);
mystatement.bindDouble(4, 123456.789);
mystatement.step();
mystatement.dispose();SQLiteStatement mystatement = mydbc.prepareStatement("SELECT * FROM mytable;");
boolean keep_going = mystatement.step();
while (keep_going) {
int colcount = colcount = mystatement.getColumnCount();
android.util.Log.e("MySQLiteApp", "Row with " + colcount + " columns");
for (int i=0; i<colcount; ++i) {
int coltype = mystatement.getColumnType(i);
switch(coltype) {
case SQLColumnType.INTEGER:
android.util.Log.e("MySQLiteApp",
"Col " + i + " type: INTEGER (long) value: 0x" +
java.lang.Long.toHexString(mystatement.getColumnLong(i)));
break;
case SQLColumnType.REAL:
android.util.Log.e("MySQLiteApp",
"Col " + i + " type: REAL value: " + mystatement.getColumnDouble(i));
break;
case SQLColumnType.NULL:
android.util.Log.e("MySQLiteApp", "Col " + i + " type: NULL (no value)");
break;
default:
android.util.Log.e("MySQLiteApp",
"Col " + i + " type: " + ((coltype == SQLColumnType.BLOB) ? "BLOB" : "TEXT") +
" value: " + mystatement.getColumnTextNativeString(i));
break;
}
}
keep_going = mystatement.step();
}
mystatement.dispose();mydbc.dispose();- Multiple layers with abstract interfaces to make it easier to replace the lower-level SQLiteGlue native database interface