【问题标题】:ORMLite error no databasefield annotations existsORMLite错误不存在数据库字段注释
【发布时间】:2016-01-28 17:38:29
【问题描述】:

我在运行我的 Android 应用程序时遇到此错误:

没有字段有 DatabaseField 类中的注释 [[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;
}
}

我还有一个扩展 OrmLiteBaseActivity 的文件控制器:

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

那么您对此有什么建议,我应该检查什么?

【问题讨论】:

  • @DatabaseField(generatedId = true, columnName = "vakID", id=true) Long id; 据我所知,您可以使用 generatedId 或 id,但不能同时使用两者。

标签: java android annotations ormlite


【解决方案1】:

您能否检查一下,您的数据库中是否创建了表 Vak?此表的缺失可能是导致此崩溃的原因。

【讨论】:

    【解决方案2】:

    结果证明这是 ORMLite 中围绕外来对象循环的错误,该错误已在 4.22 版中修复。 ORMLite 没有正确处理 A 有一个外域 B 有一个外域到 C 有一个外域返回到 A 的情况..

    http://ormlite.com/releases/

    如果这有效或无效,请给我发一些直接邮件@Yanny,我会相应地调整这个答案。

    【讨论】:

      【解决方案3】:

      给出解决方案可能为时已晚,但这是我的解决方案:
      您会看到 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..

      【讨论】:

        猜你喜欢
        • 2021-09-05
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        相关资源
        最近更新 更多