2

私はコア ORMLite と Android の 4.46 バージョンを使用していますが、常にこの問題を抱えています。

フークラス

@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 (フラグメントから 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() (リストを返す)を取得しようとして、以前にデータを保存していなかった場合、空のリストまたは null の代わりに NullPointerException が返されます。このような:

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

what proguard で縮小 -> 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.** { *; }

この行は、プロガードがパブリックメソッドと変数を削除しないようにします..

-keepclassmembers class classpath.** { public *; }
atlest id の列名を書き込む必要があるため...それを検索し、名前の変更をプロガードします...そのため、主キーの列名IDを定義する必要があります..

于 2016-01-28T09:21:33.873 に答える
1

最後に、 DatabaseConfigUtilの問題だったと思います。なんらかの理由で、Android でのパフォーマンスを向上させる目的で raw フォルダーに生成されたファイルが正しく更新されませんでした。

これは、Eclipse からクラスを実行した場合にのみ発生します。端末から実行した場合、すべて正常に動作します。なぜこの奇妙な振る舞いをするのかわかりません。今では常にターミナルから実行しています。

于 2013-09-22T08:55:54.090 に答える