简体   繁体   English

SQLiteDatabase'没有实现接口'

[英]SQLiteDatabase 'does not implement interface'

Getting this error when I use SQLiteDatabase as a Closeable 使用SQLiteDatabase作为Closeable时出现此错误

I've got a sample project to recreate it: 我有一个示例项目来重新创建它:

https://github.com/blundell/SQLDatabaseError https://github.com/blundell/SQLDatabaseError

With a class that extends SQLiteOpenHelper : 使用扩展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: API:

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html 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/android/database/sqlite/SQLiteClosable.html

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

This should work shouldn't it? 这应该工作不应该吗?

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

Doesn't work: 不起作用:

  • Xperia Play Android 2.3.4 Xperia Play Android 2.3.4
  • Motorola Xoom Android 4.0.4 摩托罗拉Xoom Android 4.0.4

Does work: 工作:

  • Samsung Galaxy Nexus Android 4.2 三星Galaxy Nexus Android 4.2

Okay, found the problem in the Change Notes for 4.1 (API Level 16) : 好的, 在4.1的更改说明(API级别16)中发现了问题:

android.database.sqlite.SQLiteClosable implements java.io.Closeable only from API Level 16. Before that, they were unrelated (even though both interfaces existed since the beginning). android.database.sqlite.SQLiteClosable仅从API级别16实现java.io.Closeable 。在此之前,它们是无关的(即使两个接口从一开始就存在)。

So you should use SQLiteClosable directly if you want your code to be backwards compatible. 因此,如果您希望代码向后兼容,则应直接使用SQLiteClosable。

It is also probably worthwhile to install the SDK for the lowest version you want to support and try to build with it, then this would have been detected by the compiler. 也可能值得为您想要支持的最低版本安装SDK并尝试使用它构建,然后编译器会检测到这一点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM