Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ORMLite错误不存在数据库字段批注_Java_Android_Annotations_Ormlite - Fatal编程技术网

Java ORMLite错误不存在数据库字段批注

Java ORMLite错误不存在数据库字段批注,java,android,annotations,ormlite,Java,Android,Annotations,Ormlite,我在运行Android应用程序时出现以下错误: 没有字段具有数据库字段 类[[Lmodel.Vak]中的注释 我的类Vak有注释,所以我真的不明白为什么它仍然给我这个错误 package model; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; @DatabaseTable(tableName = "vak") public class Vak { @D

我在运行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;
}
}
我还有一个扩展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;
}
}

你对此有什么建议吗,我应该检查什么?

这是ORMLite在4.22版中修复的外部对象循环中的一个错误。ORMLite没有正确处理a有一个外部字段B,该字段有一个外部字段到C,该字段有一个外部字段返回到a


如果这起作用或不起作用,请给我发送一些直接邮件@Yanny,我将相应地调整此答案。

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

给出解决方案可能已经晚了,但这是我的解决方案: 您会看到proguard试图混淆代码,如果您深入阅读proguard或简介 proguard中的收缩功能->收缩程序(如proguard)可以分析字节码并删除未使用的类、字段和方法。 因此,从这里我们可以假设它正在删除您的对象,因为它没有被任何地方使用。。。 那么你可能需要什么? 您需要阻止proguard逃避该过程中的方法或对象 因此,这是一条线 -保持类com.j256** -keepclassmembers类com.j256.*{*;} -保留enum com.j256** -keepclassmembers enum com.j256.*{*;} -保留com.j256接口** -keepclassmembers接口com.j256.*{*;} 此行将阻止proguard删除我的公共方法和变量。。 -keepclassmembers类类路径。**{ 公众*; } 您需要为atlest id写入列名…因为它将搜索它并将预先更改其名称…因此您需要为主键定义列名id。

@DatabaseFieldgeneratedId=true,columnName=vakID,id=true Long id;据我所知,您可以使用generatedId或id,但不能同时使用两者。 http://proguard.sourceforge.net/FAQ.html