Ormlite SQLiteCursor:将null上的游标关闭两次或更多次

Tha*_*han 9 android ormlite android-sqlite

我有Coach一个具有ScheduleEntity对象集合的类;

public class Coach{

    @ForeignCollectionField(columnName = FIELD_SCHEDULE_ENTITY)
    private Collection<ScheduleEntity> scheduleEntities;
}
Run Code Online (Sandbox Code Playgroud)

[...]

public class ScheduleEntity {

    @DatabaseField(columnName = FIELD_COACH, foreign = true)
    private Coach coach;
}
Run Code Online (Sandbox Code Playgroud)

我想先找回ScheduleEntity教练.

当我这样做时使用QueryBuilder:

public ScheduleEntity getFirstScheduleForCoach(Coach coach) throws SQLException {
    QueryBuilder<ScheduleEntity, Long> queryBuilder = scheduleEntityDao.queryBuilder();
    queryBuilder
            .where()
            .eq(ScheduleEntity.FIELD_COACH, coach);
   return scheduleEntityDao.queryForFirst(queryBuilder.prepare());
Run Code Online (Sandbox Code Playgroud)

一些奇怪的信息出现在logcat中:

Close cursor android.database.sqlite.SQLiteCursor@42321aa0 on null twice or more
Run Code Online (Sandbox Code Playgroud)

但是,当我以另一种方式这样做时:

return scheduleEntityDao.queryForEq(ScheduleEntity.FIELD_COACH, coach).iterator().next();
Run Code Online (Sandbox Code Playgroud)

一切都很好(不关心可能的nullpointer).

这些信息意味着什么?我做错了什么还是正常行为?

nad*_*ima 4

我继续下载了 ORMLite 的代码。

AndroidCompiledStatement第89行的类中,我将close方法更改如下:

public void close() throws IOException {
    if (cursor != null) {
        try {
            cursor.close();
        } catch (android.database.SQLException e) {
            throw new IOException("Problems closing Android cursor", e);
        }
    }
    cancellationHook = null;
}
Run Code Online (Sandbox Code Playgroud)

public void close() throws IOException {
    if (cursor != null && !cursor.isClosed()) {
        try {
            cursor.close();
        } catch (android.database.SQLException e) {
            throw new IOException("Problems closing Android cursor", e);
        }
    }
    cancellationHook = null;
}
Run Code Online (Sandbox Code Playgroud)

只需检查光标是否已经关闭就可以为我解决这个问题,尽管您必须将 ormlite-android git 克隆到您的项目中。