2

我使用 4.46 版本的核心 ORMLite 和 Android,我一直有这个问题。

Foo 类

@DatabaseTable
public class Foo {

    @DatabaseField(generatedId = true)
    public int id;
    @DatabaseField(index = true)
    public String title;
    @ForeignCollectionField
    ForeignCollection<Foo2> foo2s;

    public Foo() {
        // needed by ormlite
    }

}

Foo2 类

@DatabaseTable
public class Foo2 {

    @DatabaseField(generatedId = true)
    public int id;
    @DatabaseField
    public Date date;

    public Foo2() {
        // needed by ormlite
    }
}

ORMLiteFragment(我需要从 Fragment 调用 getHelper())

public class OrmLiteFragment extends Fragment {

    private DatabaseHelper databaseHelper = null;

    protected DatabaseHelper getHelper() {
        if (databaseHelper == null) {
            databaseHelper =
                OpenHelperManager.getHelper(getActivity(), DatabaseHelper.class);
        }
        return databaseHelper;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (databaseHelper != null) {
            OpenHelperManager.releaseHelper();
            databaseHelper = null;
        }
    }
}

活动

public class MainActivity extends FragmentActivity {
    /**
    * Some methods non important for this...
    */

    public static class SectionFragment extends OrmLiteFragment { 
        @Override
        public View onCreateView(LayoutInflater inflater,
                ViewGroup container, Bundle savedInstanceState) {

            // Some code....

            getHelper().getFoo2RuntimeDao(); // HERE FIRES THE ERROR!

            // Some code....
        }
    }
}

DatabaseHelper 类与Android 示例代码页相同,但具有 Foo2RuntimeDao() 和 Foo1RuntimeDao()

问题

09-03 14:27:15.756: E/AndroidRuntime(557): FATAL EXCEPTION: main
09-03 14:27:15.756: E/AndroidRuntime(557): java.lang.IllegalArgumentException: No fields have a DatabaseField annotation in class java.lang.Character
09-03 14:27:15.756: E/AndroidRuntime(557):  at com.j256.ormlite.table.DatabaseTableConfig.extractFieldTypes(DatabaseTableConfig.java:215)
09-03 14:27:15.756: E/AndroidRuntime(557):  at com.j256.ormlite.table.DatabaseTableConfig.fromClass(DatabaseTableConfig.java:146)
09-03 14:27:15.756: E/AndroidRuntime(557):  at com.j256.ormlite.table.TableInfo.<init>(TableInfo.java:53)
09-03 14:27:15.756: E/AndroidRuntime(557):  at com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:149)
09-03 14:27:15.756: E/AndroidRuntime(557):  at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:126)

- 更新 1

如果我尝试获取一个queryForAll()(返回一个列表)并且我之前没有保存数据,我会得到一个 NullPointerException 而不是一个空列表或 null。像这样:

public class MainActivity2 extends OrmLiteBaseActivity<DatabaseHelper> {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getHelper().getChapterRunDao();   //This Works!
        getHelper().getChapterRunDao().queryForAll();  //This throws NullPointerException
    }
}

问题

09-04 15:32:13.261: E/AndroidRuntime(3615): FATAL EXCEPTION: main
09-04 15:32:13.261: E/AndroidRuntime(3615): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.emanga/com.emanga.ORMLite}: java.lang.NullPointerException
09-04 15:32:13.261: E/AndroidRuntime(3615):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
09-04 15:32:13.261: E/AndroidRuntime(3615):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
4

2 回答 2

2

如果您没有字段错误,这将有助于
我从这里回答:ORMLite 错误不存在数据库字段注释
提供解决方案可能为时已晚,但这是我的解决方案:
您会看到 proguard 尝试混淆代码,如果您深入阅读 proguard 或介绍

http://proguard.sourceforge.net/FAQ.html

proguard 中的 Shrinking -> ProGuard 等 Shrinking 程序可以分析字节码并删除未使用的类、字段和方法。所以据此我们可以假设它正在删除你的对象,因为它没有被任何地方使用......
所以你可能需要吗?您需要阻止 proguard 从进程中逃避该方法或对象,因此这就是该行..:
-keep class com.j256.**<br> -keepclassmembers class com.j256.** { *; }<br> -keep enum com.j256.**<br> -keepclassmembers enum com.j256.** { *; }<br> -keep interface com.j256.**<br> -keepclassmembers interface com.j256.** { *; }

此行将阻止 proguard 删除我的公共方法和变量..

-keepclassmembers class classpath.** { public *; }
您需要为 atlest id 编写列名...因为它会搜索它并会改变它的名字......所以你需要为主键定义列名ID..

于 2016-01-28T09:21:33.873 回答
1

最后,我认为这是DatabaseConfigUtil的问题。由于某些未知原因,它在原始文件夹中生成的旨在提高 Android 性能的文件未正确更新。

这只发生在我从 Eclipse 运行类时,如果我从终端运行一切正常。我不知道为什么会出现这种奇怪的行为。现在我总是从终端运行它。

于 2013-09-22T08:55:54.090 回答