質問

Androidアプリケーションを実行すると、このエラーが発生しました。

クラスにデータベースフィールドアノテーションがあるフィールドはありません[[lmodel.vak;

私のクラスVAKには注釈があるので、なぜこのエラーが私に与えているのか本当にわかりません。

package model;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "vak")
public class Vak {
    @DatabaseField(generatedId = true, columnName = "vakID", id=true) Long id;
    @DatabaseField int rij;
    @DatabaseField
    int kolom;
...
}

databasehelper.javaというファイルがあります。このファイルは、ormlitesqliteopenhelperを拡張し、ファイルは次のようになります。

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
// name of the database file for your application -- change to something
// appropriate for your app
private static final String DATABASE_NAME = "project56.db";
// any time you make changes to your database objects, you may have to
// increase the database version
private static final int DATABASE_VERSION = 1;

private DatabaseType databaseType = new SqliteAndroidDatabaseType();

// the DAO object we use to access the tables
private Dao<Vleugel, Long> vleugelDao = null;
private Dao<Verdieping, Long> verdiepingDao = null;
private Dao<NavigatiePunt, Long> navigatiePuntDao = null;
private Dao<Lokaal, Long> lokaalDao = null;
private Dao<Raster, Long> rasterDao = null;
private Dao<Vak, Long> vakDao = null;
private Dao<Graaf, Long> graafDao = null;
private Dao<Vertex, Long> vertexDao = null;
private Dao<Edge, Long> edgeDao = null;

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

/**
 * This is called when the database is first created. Usually you should
 * call createTable statements here to create the tables that will store
 * your data.
 */
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
    try {
        Log.i(DatabaseHelper.class.getName(), "onCreate");
        TableUtils.createTable(connectionSource, Vleugel.class);
        TableUtils.createTable(connectionSource, Verdieping.class);
        TableUtils.createTable(connectionSource, NavigatiePunt.class);
        TableUtils.createTable(connectionSource, Lokaal.class);
        TableUtils.createTable(connectionSource, Raster.class);
        TableUtils.createTable(connectionSource, Vak.class);
        TableUtils.createTable(connectionSource, Graaf.class);
        TableUtils.createTable(connectionSource, Vertex.class);
        TableUtils.createTable(connectionSource, Edge.class);

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

/**
 * This is called when your application is upgraded and it has a higher
 * version number. This allows you to adjust the various data to match the
 * new version number.
 */
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource,
        int oldVersion, int newVersion) {
    try {
        Log.i(DatabaseHelper.class.getName(), "onUpgrade");
        TableUtils.dropTable(connectionSource, Vleugel.class, true);
        TableUtils.dropTable(connectionSource, Verdieping.class, true);
        TableUtils.dropTable(connectionSource, NavigatiePunt.class, true);
        TableUtils.dropTable(connectionSource, Lokaal.class, true);
        TableUtils.dropTable(connectionSource, Raster.class, true);
        TableUtils.dropTable(connectionSource, Vak.class, true);
        TableUtils.dropTable(connectionSource, Graaf.class, true);
        TableUtils.dropTable(connectionSource, Vertex.class, true);
        TableUtils.dropTable(connectionSource, Edge.class, true);

        // after we drop the old databases, we create the new ones
        onCreate(db, connectionSource);
    } catch (SQLException e) {
        Log.e(DatabaseHelper.class.getName(), "Can't drop databases", e);
        throw new RuntimeException(e);
    }
}

/**
 * Returns the Database Access Object (DAO) for the classes It will create
 * it or just give the cached value.
 */
public Dao<Vleugel, Long> getVleugelDao() throws SQLException {
    if (vleugelDao == null) {
        vleugelDao = getDao(Vleugel.class);
    }
    return vleugelDao;
}

public Dao<Verdieping, Long> getVerdiepingDao() throws SQLException {
    if (verdiepingDao == null) {
        verdiepingDao = getDao(Verdieping.class);
    }
    return verdiepingDao;
}

public Dao<NavigatiePunt, Long> getNavigatiePuntDao() throws SQLException {
    if (navigatiePuntDao == null) {
        navigatiePuntDao = getDao(NavigatiePunt.class);
    }
    return navigatiePuntDao;
}

public Dao<Lokaal, Long> getLokaalDao() throws SQLException {
    if (lokaalDao == null) {
        lokaalDao = getDao(Lokaal.class);
    }
    return lokaalDao;
}

public Dao<Raster, Long> getRasterDao() throws SQLException {
    if (rasterDao == null) {
        rasterDao = getDao(Raster.class);
    }
    return rasterDao;
}

public Dao<Vak, Long> getVakDao() throws SQLException {
    if (vakDao == null) {
        vakDao = getDao(Vak.class);
    }
    return vakDao;
}

public Dao<Graaf, Long> getGraafDao() throws SQLException {
    if (graafDao == null) {
        graafDao = getDao(Graaf.class);
    }
    return graafDao;
}

public Dao<Vertex, Long> getVertexDao() throws SQLException {
    if (vertexDao == null) {
        vertexDao = getDao(Vertex.class);
    }
    return vertexDao;
}

public Dao<Edge, Long> getEdgeDao() throws SQLException {
    if (edgeDao == null) {
        edgeDao = getDao(Edge.class);
    }
    return edgeDao;
}

/**
 * Close the database connections and clear any cached DAOs.
 */
@Override
public void close() {
    super.close();
    vleugelDao = null;
    verdiepingDao = null;
    navigatiePuntDao = null;
    lokaalDao = null;
    rasterDao = null;
    vakDao = null;
    graafDao = null;
    vertexDao = null;
    edgeDao = null;
}
}

また、ormlitebaseativityを拡張するファイルコントローラーもあります。

public class Controller extends OrmLiteBaseActivity<DatabaseHelper> {

Dao<Vleugel, Long> vleugelDao;
Dao<Verdieping, Long> verdiepingDao;
Dao<NavigatiePunt, Long> navigatiePuntDao;
Dao<Lokaal, Long> lokaalDao;
Dao<Raster, Long> rasterDao;
Dao<Graaf, Long> graafDao;
Dao<Vertex, Long> vertexDao;
Dao<Edge, Long> edgeDao;
Dao<Vak, Long> vakDao;

// Databasehelper is benodigd voor ORMLite
static {
    OpenHelperManager.setOpenHelperFactory(new SqliteOpenHelperFactory() {
        public OrmLiteSqliteOpenHelper getHelper(Context context) {
            return new DatabaseHelper(context);
        }
    });
}

public Controller() throws SQLException {
    /** initialiseren van dao */
    vleugelDao = getHelper().getVleugelDao();
    verdiepingDao = getHelper().getVerdiepingDao();
    navigatiePuntDao = getHelper().getNavigatiePuntDao();
    lokaalDao = getHelper().getLokaalDao();
    rasterDao = getHelper().getRasterDao();
    graafDao = getHelper().getGraafDao();
    vertexDao = getHelper().getVertexDao();
    edgeDao = getHelper().getEdgeDao();
    vakDao = getHelper().getVakDao();
}

/**
 * Haalt vleugel idNaam op uit dao object bijv. K1
 * 
 * @return Vleugel
 * @throws java.sql.SQLException
 */

public Vleugel getVleugel(String vleugelIDNaam)
        throws java.sql.SQLException {
    // select * from vleugel where idNaam='{vleugelIDNaam}'
    QueryBuilder<Vleugel, Long> qb = vleugelDao.queryBuilder();
    Where where = qb.where();
    // the name field must be equal to "foo"
    where.eq("idNaam", vleugelIDNaam);
    PreparedQuery<Vleugel> preparedQuery = qb.prepare();
    List<Vleugel> vleugelList = vleugelDao.query(preparedQuery);
    Log.v("Getvleugel", vleugelList.size() + "");
    if (vleugelList.size() == 1) {
        return vleugelList.get(0);
    }
    return null;
}

public Verdieping getVerdieping(int nummer) throws java.sql.SQLException {
    // TODO: Met querybuilder query naar db om verdieping te pakken
    return null;
}

/**
 * Haalt navigatiepunt op
 * 
 * @param naam
 * @return
 * @throws java.sql.SQLException
 */
public NavigatiePunt getNavigatiePunt(String naam)
        throws java.sql.SQLException {
    // select * from navigatiepunt where naam='{naam}'
    QueryBuilder<NavigatiePunt, Long> qb = navigatiePuntDao.queryBuilder();
    Where where = qb.where();
    where.eq("naam", naam);
    PreparedQuery<NavigatiePunt> preparedQuery = qb.prepare();
    List<NavigatiePunt> navigatieList = navigatiePuntDao
            .query(preparedQuery);
    Log.v("GetLokaal", navigatieList.size() + "");
    if (navigatieList.size() == 1) {
        return navigatieList.get(0);
    }
    return null;
}

/**
 * Get lokaal object op basis van lokaalcode
 * 
 * @param lokaalcode
 * @return
 * @throws java.sql.SQLException
 */
public Lokaal getLokaal(String lokaalcode) throws java.sql.SQLException {
    // select * from lokaal where lokaalcode='{lokaalcode}'
    QueryBuilder<Lokaal, Long> qb = lokaalDao.queryBuilder();
    Where where = qb.where();
    where.eq("lokaalcode", lokaalcode);
    PreparedQuery<Lokaal> preparedQuery = qb.prepare();
    List<Lokaal> lokaalList = lokaalDao.query(preparedQuery);
    Log.v("GetLokaal", lokaalList.size() + "");
    if (lokaalList.size() == 1) {
        return lokaalList.get(0);
    }
    return null;
}
}

それで、これについて何かアドバイスはありますか、私は何を確認すればよいですか?

役に立ちましたか?

解決

これは、バージョン4.22で修正された外国オブジェクトループの周りのOrmliteのバグであることが判明しました。 Ormliteは、Aがcに外国のフィールドを備えた外部フィールドBを持っているケースを適切に渡していませんでした。

http://ormlite.com/releases/

これが機能するか、機能しない場合は、ダイレクトメール@yannyを送ってください。それに応じてこの回答をチューニングします。

他のヒント

DBで作成されたテーブルVAKを確認できますか?このテーブルがないことは、このクラッシュの理由になる可能性があります。

解決策を与えるのはおそらく遅れていますが、これが私の解決策です。
Proguardがコードを難読化しようとしているのを見て、Proguardを詳細に読んだりIntroを読んだり

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

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.** { *; }

このラインは、Proguardが私のパブリック方法や変数を削除しないようにします。

-keepclassmembers class classpath.** { public *; }
Atlest IDの列名を記述する必要があります...それはそれを検索し、その名前を変更するので、それが名前の変更を変更するからです...したがって、あなたはプライマリキーの列名IDを定義する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top