SQLiteDatabase 'does not implement the interface'

Getting this error when I use SQLiteDatabase as Closeable

I have a sample project to recreate it:

https://github.com/blundell/SQLDatabaseError

With a class that extends SQLiteOpenHelper :

public class DatabaseHelper extends SQLiteOpenHelper { .... public void openAndCloseDatabase() { SQLiteDatabase database = getWritableDatabase(); close(database); } private void close(Closeable database) { try { if (database != null) { database.close(); } } catch (Exception e) { Log.e("Error", "Oh no!", e); } } } 

Stack trace:

 12-14 12:23:43.719: E/AndroidRuntime(5179): FATAL EXCEPTION: main 12-14 12:23:43.719: E/AndroidRuntime(5179): java.lang.IncompatibleClassChangeError: interface not implemented 12-14 12:23:43.719: E/AndroidRuntime(5179): at com.blundell.sqldatabasecursorerror.DatabaseHelper.close(DatabaseHelper.java:35) 12-14 12:23:43.719: E/AndroidRuntime(5179): at com.blundell.sqldatabasecursorerror.DatabaseHelper.openAndCloseDatabase(DatabaseHelper.java:29) 12-14 12:23:43.719: E/AndroidRuntime(5179): at com.blundell.sqldatabasecursorerror.MainActivity.onCreate(MainActivity.java:13) 12-14 12:23:43.719: E/AndroidRuntime(5179): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 12-14 12:23:43.719: E/AndroidRuntime(5179): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623) 12-14 12:23:43.719: E/AndroidRuntime(5179): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675) 12-14 12:23:43.719: E/AndroidRuntime(5179): at android.app.ActivityThread.access$1500(ActivityThread.java:121) 12-14 12:23:43.719: E/AndroidRuntime(5179): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943) 12-14 12:23:43.719: E/AndroidRuntime(5179): at android.os.Handler.dispatchMessage(Handler.java:99) 12-14 12:23:43.719: E/AndroidRuntime(5179): at android.os.Looper.loop(Looper.java:130) 12-14 12:23:43.719: E/AndroidRuntime(5179): at android.app.ActivityThread.main(ActivityThread.java:3701) 12-14 12:23:43.719: E/AndroidRuntime(5179): at java.lang.reflect.Method.invokeNative(Native Method) 12-14 12:23:43.719: E/AndroidRuntime(5179): at java.lang.reflect.Method.invoke(Method.java:507) 12-14 12:23:43.719: E/AndroidRuntime(5179): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 12-14 12:23:43.719: E/AndroidRuntime(5179): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 12-14 12:23:43.719: E/AndroidRuntime(5179): at dalvik.system.NativeStart.main(Native Method) 

API:

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

http://developer.android.com/reference/android/database/sqlite/SQLiteClosable.html

http://developer.android.com/reference/java/io/Closeable.html

That should work, right?

  public final class SQLiteDatabase extends SQLiteClosable >> public abstract class SQLiteClosable extends Object implements Closeable >> public interface Closeable 

Does not work:

  • Xperia Play Android 2.3.4
  • Motorola Xoom Android 4.0.4

Working:

  • Samsung Galaxy Nexus Android 4.2
+7
source share
1 answer

Well, I found the problem in the Change Notes for 4.1 (API Level 16) :

android.database.sqlite.SQLiteClosable implements java.io.Closeable only from API level 16. Before that, they were not connected (although both interfaces existed from the very beginning).

Therefore, you should use SQLiteClosable directly if you want your code to be backward compatible.

It is also probably worth installing the SDK for the youngest version that you want to support, and trying to build with it, then this would be detected by the compiler.

+6
source

All Articles