Java classes with abstract interface layers to provide a simple, easy-to-use Java interface to the andriod-sqlite-native-driver library (may be adapted for other Java environments).
With a simple test Android app included.
by Christopher J. Brody aka Chris Brody mailto: brodybits@litehelpers.net
License: UNLICENSE (public domain).
src/io/liteglue/SQLiteNative.java
- low-level Java class from @liteglue / Android-sqlite-native-driver
- Native Android libraries, provided in
sqlite-native-driver-libs.zip
as built from @liteglue / Android-sqlite-native-driver
SQLCipher -sqlcipher-native-driver.jar
with native Android libraries that provide SQLCipher, as built from @liteglue / Android-sqlcipher-native-driverSQLite with ICU - Native Android libraries with ICU built-in, as built from @liteglue / Android-sqlite-native-driver-ICU
WARNING: It is recommended to extract the native per-CPU Android library subdirectories from the JAR and put them in the libs
directory of your project. Some newer Android systems do not
Include the following in your libs
directory:
- Contents of the
libs
subdirectory fromsqlite-native-driver-libs.zip
, as built from @liteglue / Android-sqlite-native-driver-- orsqlcipher-native-driver.jar
as built in @liteglue / Android-sqlcipher-native-driver sqlite-connector.jar
, which is built by simply issuing themake
command in this project
There is a simple test project in the Android-SQLiteConnectorTest
subdirectory. To test:
- Build
sqlite-connector.jar
in this project (using themake
command) - Build the
sqlite-native-driver
native libs in @liteglue / Android-sqlite-native-driver cd Android-SQLiteConnectorTest
- Install
sqlite-connector.jar
and the contents of thelibs
subdirectory fromsqlite-native-driver-libs.zip
into thelibs
subdirectory ofAndroid-SQLiteConnectorTest
as described above - You may have to update your project using a command like:
android update project -p .
- install it on your emulator or device:
ant debug install
- run it on your emulator or device
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);
OPTIONAL, for use with sqlcipher-native-driver.jar
only: to specify the password key:
mydbc.keyNativeString("your-password");
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