2012-12-14 11 views
7

otrzymuję ten błąd, gdy używam SQLiteDatabase jako CloseableSQLiteDatabase „nie implementuje interfejs”

Mam przykładowy projekt, aby go odtworzyć:

https://github.com/blundell/SQLDatabaseError

z klasą, która rozciąga SQLiteOpenHelper : trace

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); 
    } 
} 

} 

Stos:

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

To powinno działać nie powinno?

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

nie działa:

  • Xperia Odtwórz Android 2.3.4
  • Motorola Xoom Android 4.0.4

działa:

  • Samsung Galaxy Nexus z Androidem 4,2
+0

'public class DatabaseHelper rozszerza narzędzia SQLiteOpenHelper Closeable' jest również możliwe. – waqaslam

+1

(Nie jest to programista systemu Android) IncompatibleClassChangeError brzmi jak kompilujesz i działasz na różnych wersjach biblioteki. – ignis

+0

Zobacz zaakceptowaną odpowiedź tutaj: http://stackoverflow.com/questions/1980452/what-causes-java-lang-incompatibleclasschangeerror –

Odpowiedz

6

Dobra, znalazłem problem in the Change Notes for 4.1 (API Level 16):

android.database.sqlite.SQLiteClosable narzędzi java.io.Closeable tylko z API Level 16. Wcześniej były niepowiązane (choć istniały oba interfejsy od początku).

Należy więc użyć SQLiteClosable bezpośrednio, jeśli chcesz, aby Twój kod był kompatybilny wstecz.

Warto również zainstalować pakiet SDK dla najniższej wersji, którą chcesz obsłużyć, i spróbować skompilować z nią, to zostałoby wykryte przez kompilator.

+0

Byłoby miło, gdyby to zostało odnotowane gdzieś w Javadoc dla SQLiteClosable. – Thilo

+0

Dzięki, dobre miejsce! Wstydzę się, że jest to z api16 więcej kodu sprawdzającego bezpieczeństwo do napisania. Tak, Lint normalnie przechwytuje oczywiste wymagania poziomu API, ale jak mówisz, oba są dostępne z API 1. Może utworzyć ostrzeżenie o Lintach i je wypchnąć. – Blundell

+0

Właśnie zostałem ukąszony przez to jeszcze raz! Tym razem z 'java.util.Scanner' http://developer.android.com/sdk/api_diff/19/changes/java.util.Scanner.html – Blundell

Powiązane problemy