【问题标题】:SQLiteDatabase 'does not implement interface'SQLiteDatabase '不实现接口'
【发布时间】:2012-12-02 11:13:59
【问题描述】:

当我将SQLiteDatabase 用作Closeable 时出现此错误

我有一个示例项目来重新创建它:

https://github.com/blundell/SQLDatabaseError

使用扩展 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);
    }
}

}

堆栈跟踪:

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

这应该可以吧?

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

不起作用:

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

有效:

  • 三星 Galaxy Nexus Android 4.2

【问题讨论】:

  • public class DatabaseHelper extends SQLiteOpenHelper implements Closeable 也是可能的。
  • (不是 Android 开发人员)IncompatibleClassChangeError 听起来您正在针对不同版本的库进行编译和运行。
  • 在此处查看接受的答案:stackoverflow.com/questions/1980452/…
  • @ignis 和 Anders:是的,但是这些接口从 API 级别 1 就已经存在,我认为 Android 可以保证二进制向上兼容性。奇怪...

标签: java android android-sqlite implements


【解决方案1】:

好的,找到问题in the Change Notes for 4.1 (API Level 16)

android.database.sqlite.SQLiteClosable 仅从 API 级别 16 实现 java.io.Closeable。在此之前,它们是不相关的(尽管这两个接口从一开始就存在)。

因此,如果您希望代码向后兼容,则应直接使用 SQLiteClosable。

也可能值得为您想要支持的最低版本安装 SDK 并尝试使用它进行构建,然后编译器会检测到这一点。

【讨论】:

  • 如果在 Javadoc 中为 SQLiteClosable 的某个地方也注明了这一点,那就太好了。
  • 谢谢,好地方!耻辱它来自 api16 更多的安全检查代码来编写。是的,Lint 通常会捕获明显的 API 级别请求,但正如您所说,它们都可以从 API 1 中获得。可能会创建一个 Lint 警告并将其推送。
  • 又被这个咬了!这次是java.util.Scannerdeveloper.android.com/sdk/api_diff/19/changes/…
  • Lint API 检查器怎么没有发现这个?
猜你喜欢
  • 2016-06-20
  • 1970-01-01
  • 2017-12-13
  • 2023-03-13
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
相关资源
最近更新 更多