Damodar,
Interestingly, but not in any way useful, the JDBC Driver is not based
on the android.database code at all.
The Database code used in SQLite.JDBC2y.JDBCConnection (actually
DatabaseX, which is small sublcass of Database):
http://code.google.com/searchframe#r07P-bJdvBY/trunk/Android%20Java%20Framework/src/SQLite/Database.java
Uses a direct native call to open the database
private native void _open(String filename, int mode)
throws SQLite.Exception;
I didn't dig into the native code.
So it seems that google have two parallel and unrelated paths to database.
If I get a chance I'll look again, but I'm not optimistic that any of
these problems are solvable outside of the Android implementation.
Interestingly, the code you provided ran flawlessly against the
compatibility layer on Linux - a layer which is more like the Android
JDBC2y than the android.database code.
Finally, I noticed this in the JDBC2y result set:
public java.sql.Blob getBlob(String columnIndex) throws SQLException {
throw new SQLException("not supported");
}
so it seems SQLDroid is still the only JDBC driver that supports Blobs.
Jim
On 05/17/2012 06:03 PM, Damodar Periwal wrote:
> I did toString() on two separate connections, and based on the output,
> they seem to be different:
>
> *Code:*
>
> String jdbcURL = "jdbc:sqlite:" + databasePath;
> Class.forName("SQLite.JDBCDriver");
>
> Connection conn10 = DriverManager.getConnection(jdbcURL);
> Connection conn11 = DriverManager.getConnection(jdbcURL);
> System.out.println("Conn10: " + conn10.toString());
> System.out.println("Conn11: " + conn11.toString());
>
> *Output:*
>
> 05-17 23:58:02.318: INFO/System.out(1437): Conn10:
> SQLite.JDBC2y.JDBCConnection@43e457e8
> 05-17 23:58:02.318: INFO/System.out(1437): Conn11:
> SQLite.JDBC2y.JDBCConnection@43e45bd8
>
> I don't know anything about the internal implementation of
> SQLite.JDBCDriver.
>
> -- Damodar
>
> On Thu, May 17, 2012 at 4:54 PM, Jim Redman <
jre...@ergotech.com
> <mailto:
jre...@ergotech.com>> wrote:
>
> Damodar,
>
> Are the connections independent? Or do that do what I proposed and
> just return the same connection to the database?
>
> Jim
>
>
> On 05/17/2012 05:44 PM, Damodar Periwal wrote:
>
> Jim,
>
> Interestingly, I ran the same program with the 'inbuilt' but
> unsupported
> sqlite JDBC driver (SQLite.JDBCDriver) on Android 2.2.
>
> String jdbcURL = "jdbc:sqlite:" + databasePath;
> Class.forName("SQLite.__JDBCDriver");
>
> It ran fine without running into any issues associated with
> setAutoCommit(false). This indicates that the problem may be at the
> JDBC driver level because both implementations are perhaps using the
> same underlying Android database layer.
>
> Thanks,
>
> -- Damodar
>
> On Thu, May 17, 2012 at 4:25 PM, Jim Redman
> <
jre...@ergotech.com <mailto:
jre...@ergotech.com>
> DriverManager.getConnection(____jdbcURL);
> Connection conn11 =
> DriverManager.getConnection(____jdbcURL);
>
> // ok
> Connection conn12 =
> DriverManager.getConnection(____jdbcURL);
>
> // ok
> conn10.setAutoCommit(true);
> Connection conn13 =
> DriverManager.getConnection(____jdbcURL);
>
> // ok
> conn13.setAutoCommit(true);
> Connection conn14 =
> DriverManager.getConnection(____jdbcURL);
>
> // ok
> conn11.setAutoCommit(true);
> Connection conn15 =
> DriverManager.getConnection(____jdbcURL);
>
> // ok
> conn12.setAutoCommit(false);
> Connection conn16 =
> DriverManager.getConnection(____jdbcURL);
>
> // NOT ok
>
> I don't know if the following stack trace mentioning
> android-metadata or
> setLocale() can shed some extra light:
>
> 05-17 22:32:59.638: INFO/SQlDRoid(308): opening database
>
> /data/data/com.damodar.____android.jdbc2/databases/test.____db
>
> *05-17 22:33:01.167: INFO/Database(308): sqlite
> returned: error
> code =
> 5, msg = database is locked*
> *05-17 22:33:01.167: ERROR/Database(308): CREATE TABLE
> android_metadata
>
> failed
> 05-17 22:33:01.409: ERROR/Database(308): Failed to
> setLocale() when
> constructing, closing the database*
>
> 05-17 22:33:01.409: ERROR/Database(308):
> android.database.sqlite.____SQLiteException: database is
> locked
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> android.database.sqlite.____SQLiteDatabase.native_____setLocale(Native
>
> Method)
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> android.database.sqlite.____SQLiteDatabase.setLocale(____SQLiteDatabase.java:1950)
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> android.database.sqlite.____SQLiteDatabase.<init>(____SQLiteDatabase.java:1818)
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> android.database.sqlite.____SQLiteDatabase.openDatabase(____SQLiteDatabase.java:817)
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> org.sqldroid.SQLiteDatabase.<____init>(SQLiteDatabase.java:80)
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> org.sqldroid.____SQLDroidConnection.<init>(____SQLDroidConnection.java:80)
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> org.sqldroid.SQLDroidDriver.____connect(SQLDroidDriver.java:____45)
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> java.sql.DriverManager.____getConnection(DriverManager.____java:191)
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> java.sql.DriverManager.____getConnection(DriverManager.____java:154)
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> com.damodar.android.jdbc2.____HelloAndroidJDBC2Activity.____tryJDBC(____HelloAndroidJDBC2Activity.____java:51)
>
> 05-17 22:33:01.409: ERROR/Database(308): at
>
> com.damodar.android.jdbc2.____HelloAndroidJDBC2Activity.____onCreate(____HelloAndroidJDBC2Activity.____java:23)
> How accurate a representation of what you want to do
> is the
> test?
>
> There are a couple of fairly easy solutions to the test.
>
> The fundamental problem with the test is that calling
> "getConnection" repeatedly cause multiple calls to
>
> new SQLiteDatabase(dbQname, timeout);
>
> and so to:
>
>
> sqliteDatabase =
>
>
> android.database.sqlite.______SQLiteDatabase.openDatabase(______dbQname,
> null,
>
> android.database.sqlite.______SQLiteDatabase.CREATE_IF_______NECESSARY
> |
>
> android.database.sqlite.______SQLiteDatabase.OPEN_READWRITE)______;
> DriverManager.getConnection(______jdbcURL);
>
>
> System.out.println("After getting
> connection...1");
>
> conn1.setAutoCommit(true); // This
> statement does not
> create any problem in subsequent creation of a new
> connection
> conn1.setAutoCommit(false); // Problem
> statement
> conn1.setAutoCommit(true); //
> However, this
> statement sets
> things correct again
>
> Connection conn2 =
> DriverManager.getConnection(______jdbcURL);
>
>
> // succeeds
> System.out.println("After getting
> connection...2");
>
> However, if a call to getConnection() is immediately
> preceded with
> conn1.setAutoCommit(*false*), the
> getConnection() fails
> with the
> same
>
> error (error code = 5, msg = database is locked):
>
> Connection conn1 =
> DriverManager.getConnection(______jdbcURL);
>
>
> System.out.println("After getting
> connection...1");
>
> conn1.setAutoCommit(false); // This
> statement somehow
> causes the problem in subsequent creation of a
> connection.
>
> Connection conn2 =
> DriverManager.getConnection(______jdbcURL);
> <mailto:
jre...@ergotech.com <mailto:
jre...@ergotech.com>>>__>__>
> /DriverManager.getConnection()________/
> on line 43
>
> succeeds
> but the
> call to
> /DriverManager.getConnection()________/
> <tel:
408-410-9088 <tel:
408-410-9088>>> <tel:
408-410-9088
> /data/data/com.damodar.________android.jdbc2/databases/test.________db, new
>
>
>
> database
> created = true
> 05-16 23:30:00.547: INFO/SQLDroid(448): new
> sqlite jdbc
> from url
> 'jdbc:sqldroid:/data/data/com.________damodar.android.jdbc2/________databases/test.db',
>
>
>
> '{}'
> 05-16 23:30:00.547: INFO/SQlDRoid(448):
> opening
> database
>
>
>
> /data/data/com.damodar.________android.jdbc2/databases/test.________db
>
>
>
> 05-16 23:30:00.567:
> INFO/System.out(448): After
> getting
> connection...1
> 05-16 23:30:00.567: INFO/SQLDroid(448): new
> sqlite jdbc
> from url
> 'jdbc:sqldroid:/data/data/com.________damodar.android.jdbc2/________databases/test.db',
>
>
>
> '{}'
> 05-16 23:30:00.567: INFO/SQlDRoid(448):
> opening
> database
>
>
>
> /data/data/com.damodar.________android.jdbc2/databases/test.________db
>
>
>
> 05-16 23:30:00.579:
> INFO/System.out(448): After
> getting
> connection...2
> 05-16 23:30:00.587: INFO/SQLDroid(448): new
> sqlite jdbc
> from url
> 'jdbc:sqldroid:/data/data/com.________damodar.android.jdbc2/________databases/test.db',
>
>
>
> '{}'
> 05-16 23:30:00.587: INFO/SQlDRoid(448):
> opening
> database
>
>
>
> /data/data/com.damodar.________android.jdbc2/databases/test.________db
>
>
>
> 05-16 23:30:02.452: INFO/Database(448):
> sqlite
> returned:
> error
> code = 5,
> msg = database is locked
> 05-16 23:30:02.452: ERROR/Database(448):
> CREATE
> TABLE
> android_metadata
> failed
> 05-16 23:30:02.458: ERROR/Database(448):
> Failed to
> setLocale() when
> constructing, closing the database
> 05-16 23:30:02.458: ERROR/Database(448):
>
> android.database.sqlite.________SQLiteException:
>
> database is
>
> locked
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.database.sqlite.________SQLiteDatabase.native_________setLocale(Native
>
>
>
> Method)
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.database.sqlite.________SQLiteDatabase.setLocale(________SQLiteDatabase.java:1950)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.database.sqlite.________SQLiteDatabase.<init>(________SQLiteDatabase.java:1818)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.database.sqlite.________SQLiteDatabase.openDatabase(________SQLiteDatabase.java:817)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> org.sqldroid.SQLiteDatabase.<________init>(SQLiteDatabase.__java:__80)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> org.sqldroid.________SQLDroidConnection.<init>(________SQLDroidConnection.java:80)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> org.sqldroid.SQLDroidDriver.________connect(SQLDroidDriver.__java:______45)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> java.sql.DriverManager.________getConnection(DriverManager.________java:191)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> java.sql.DriverManager.________getConnection(DriverManager.________java:154)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> com.damodar.android.jdbc2.________HelloAndroidJDBC2Activity.________tryJDBC(________HelloAndroidJDBC2Activity.________java:48)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> com.damodar.android.jdbc2.________HelloAndroidJDBC2Activity.________onCreate(________HelloAndroidJDBC2Activity.________java:23)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.app.Instrumentation.________callActivityOnCreate(________Instrumentation.java:1047)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.app.ActivityThread.________performLaunchActivity(________ActivityThread.java:2627)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.app.ActivityThread.________handleLaunchActivity(________ActivityThread.java:2679)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.app.ActivityThread.________access$2300(ActivityThread.________java:125)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.app.ActivityThread$H.________handleMessage(____ActivityThread.____java:2033)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
> android.os.Handler.________dispatchMessage(Handler.java:________99)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
> android.os.Looper.loop(Looper.________java:123)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> android.app.ActivityThread.________main(ActivityThread.java:____4627)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
> java.lang.reflect.Method.________invokeNative(Native
> Method)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
> java.lang.reflect.Method.________invoke(Method.java:521)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> com.android.internal.os.________ZygoteInit$________MethodAndArgsCaller.run(________ZygoteInit.java:868)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
>
>
> com.android.internal.os.________ZygoteInit.main(ZygoteInit.________java:626)
>
>
>
> 05-16 23:30:02.458: ERROR/Database(448):
> at
>
> dalvik.system.NativeStart.________main(Native Method)
>
>
>
> 05-16 23:30:02.468:
> INFO/System.out(448): JDBC Error
> Unable to Chain
> SQLException database is locked
> 05-16 23:30:02.488: ERROR/JDBC(448): Error
> 05-16 23:30:02.488: ERROR/JDBC(448):
> java.sql.SQLException:
> Unable to
> Chain SQLException database is locked
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> org.sqldroid.________SQLDroidConnection.________chainException(________SQLDroidConnection.java:117)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> org.sqldroid.SQLiteDatabase.<________init>(SQLiteDatabase.__java:__94)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> org.sqldroid.________SQLDroidConnection.<init>(________SQLDroidConnection.java:80)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> org.sqldroid.SQLDroidDriver.________connect(SQLDroidDriver.__java:______45)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> java.sql.DriverManager.________getConnection(DriverManager.________java:191)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> java.sql.DriverManager.________getConnection(DriverManager.________java:154)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> com.damodar.android.jdbc2.________HelloAndroidJDBC2Activity.________tryJDBC(________HelloAndroidJDBC2Activity.________java:48)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> com.damodar.android.jdbc2.________HelloAndroidJDBC2Activity.________onCreate(________HelloAndroidJDBC2Activity.________java:23)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> android.app.Instrumentation.________callActivityOnCreate(________Instrumentation.java:1047)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> android.app.ActivityThread.________performLaunchActivity(________ActivityThread.java:2627)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> android.app.ActivityThread.________handleLaunchActivity(________ActivityThread.java:2679)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> android.app.ActivityThread.________access$2300(ActivityThread.________java:125)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> android.app.ActivityThread$H.________handleMessage(____ActivityThread.____java:2033)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
> android.os.Handler.________dispatchMessage(Handler.java:________99)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
> android.os.Looper.loop(Looper.________java:123)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> android.app.ActivityThread.________main(ActivityThread.java:____4627)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
> java.lang.reflect.Method.________invokeNative(Native
> Method)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
> java.lang.reflect.Method.________invoke(Method.java:521)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> com.android.internal.os.________ZygoteInit$________MethodAndArgsCaller.run(________ZygoteInit.java:868)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
>
>
> com.android.internal.os.________ZygoteInit.main(ZygoteInit.________java:626)
>
>
>
> 05-16 23:30:02.488: ERROR/JDBC(448): at
>
> dalvik.system.NativeStart.________main(Native Method)
>
>
>
> 05-16 23:30:02.758:
> INFO/ActivityManager(73):
> Displayed
> activity
>
>
>
> com.damodar.android.jdbc2/.________HelloAndroidJDBC2Activity:
>
> 3420 ms
>
>
> (total
> 3420 ms)
>
>
> --
> Jim Redman
>
(505) 662 5156 x85 <tel:%28505%29%20662%205156%20x85>
> <tel:%28505%29%20662%205156%__20x85>
> <tel:%28505%29%20662%205156%____20x85>
> <tel:%28505%29%20662%205156%______20x85>