【问题标题】:Could not find OpenHelperClass because none of the generic parameters of class找不到 OpenHelperClass,因为没有类的通用参数
【发布时间】:2014-07-11 16:49:27
【问题描述】:

我正在使用带有 sqlite 的 ormlite。但是我们得到的错误是这样的:

07-11 12:39:10.680:E/AndroidRuntime(1415):致命异常:主要 07-11 12:39:10.680: E/AndroidRuntime(1415): 进程: com.mmd.testormlite,PID:1415 07-11 12:39:10.680: E/AndroidRuntime(1415): java.lang.IllegalStateException: 不能 找到 OpenHelperClass 因为没有类的泛型参数 com.mmd.testormlite.MainActivity 类扩展 OrmLiteSqliteOpenHelper。你应该使用 getHelper(Context, Class) 反而。 07-11 12:39:10.680:E/AndroidRuntime(1415):在 com.j256.ormlite.android.apptools.OpenHelperManager.lookupHelperClass(OpenHelperManager.java:273) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 com.j256.ormlite.android.apptools.OpenHelperManager.getHelper(OpenHelperManager.java:105) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 data.DatabaseManager.getHelper(DatabaseManager.java:17) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 data.Repo.(Repo.java:13) 07-11 12:39:10.680: E/AndroidRuntime(1415):在 com.mmd.testormlite.MainActivity$1.onClick(MainActivity.java:28) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 android.view.View.performClick(View.java:4438) 07-11 12:39:10.680: E/AndroidRuntime(1415):在 android.view.View$PerformClick.run(View.java:18422) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 android.os.Handler.handleCallback(Handler.java:733) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 android.os.Handler.dispatchMessage(Handler.java:95) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 android.os.Looper.loop(Looper.java:136) 07-11 12:39:10.680: E/AndroidRuntime(1415):在 android.app.ActivityThread.main(ActivityThread.java:5017) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 java.lang.reflect.Method.invokeNative(Native Method) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 java.lang.reflect.Method.invoke(Method.java:515) 07-11 12:39:10.680: E/AndroidRuntime(1415):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 07-11 12:39:10.680:E/AndroidRuntime(1415):在 dalvik.system.NativeStart.main(Native Method)

DatabaseManager 类:

public class DatabaseManager<H extends OrmLiteSqliteOpenHelper> {

    private H helper;

    public H getHelper(Context context)
    {
        if(helper == null)
        {
            helper = (H) OpenHelperManager.getHelper(context);//The method getHelper(Context) from the type OpenHelperManager is deprecated. why ?
        }
        return helper;
    }

    public void releaseHelper(H helper)
    {
        if (helper != null) {
            OpenHelperManager.release();//The method getHelper(Context) from the type OpenHelperManager is deprecated. why ?
            helper = null;
        }
    }

}

DatabaseHelper 类:

public class DatabaseHelper extends OrmLiteSqliteOpenHelper{
    private static final String DATABASE_NAME = "db.sqlite";
    private static final int DATABASE_VERSION = 1;

    private Dao<News, Integer> userDao = null;


    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

        DatabaseInitializer initializer = new DatabaseInitializer(context);
        try {
            initializer.createDatabase();
            initializer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    @Override
    public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
        try {
            Log.i(DatabaseHelper.class.getName(), "onCreate");

            TableUtils.createTable(connectionSource, News.class);

        } catch (SQLException e) {
            Log.e(DatabaseHelper.class.getName(), "Can't create database", e);
            throw new RuntimeException(e);
        }
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        try {
            Log.i(DatabaseHelper.class.getName(), "onUpgrade");

            TableUtils.dropTable(connectionSource, News.class, true);

            onCreate(db);
        } catch (SQLException e) {
            Log.e(DatabaseHelper.class.getName(), "Can't drop databases", e);
            throw new RuntimeException(e);
        }
    }

    @Override
    public void close() {
        super.close();
        userDao = null;
    }

    public Dao<News, Integer> getNewsDao() {
        if (userDao == null) {
            try {
                userDao =DaoManager.createDao(getConnectionSource(), News.class);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            }
            return userDao;
    }
}

【问题讨论】:

    标签: android sqlite ormlite


    【解决方案1】:

    这是错误中重要的一行:

    E/AndroidRuntime(1415):java.lang.IllegalStateException:找不到 OpenHelperClass,因为类 com.mmd.testormlite.MainActivity 的通用参数都没有扩展 OrmLiteSqliteOpenHelper。您应该改用 getHelper(Context, Class) 。

    OrmLite 正在尝试使用您传入的上下文(在本例中为 MainActivity作为 OpenHelperClass

    来自ORMLite documentation for OpenHelperManager.getHelper(Context ctx)

    类似于getHelper(Context, Class)(推荐),除了我们必须通过其他方式找到帮助类。此方法要求 Context 是扩展 ORMLite 的 Android 基类之一的类,例如 OrmLiteBaseActivity。需要在 strings.xml 中设置那个或辅助类。

    所以,你有四个选择:

    • 为了让您简单地传入 Activity 上下文以获取 Helper 类,您的 Activity 必须扩展 OrmLiteBaseActivity
    • 您可以将 strings.xml 文件中的类名设置为 detailed in the docs: &lt;string name="open_helper_classname"&gt;your.package.name.DatabaseHelper&lt;/string&gt; 或类似名称
    • 你可以通过调用OpenHelperManager.setOpenHelperClass(Class openHelperClass)来设置类名
    • 你可以在你的DatabaseManager类中提供一个具体的类名,像这样:helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);

    最后,您问为什么不推荐使用OpenHelperManager.release();。我不确定为什么它已被弃用(文档表明这可能只是命名/约定更改),但您应该改用 OpenHelperManager.releaseHelper();

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 2014-11-15
      • 2017-05-10
      • 1970-01-01
      • 2015-12-20
      • 2013-12-13
      • 2011-04-19
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多