为简单起见,我有以下模型:

@Table(name = "Items")
class TItem extends Model {
    @Column(name = "title")
    private String      mTitle;

    public String getTitle() { return mTitle; }

    public void setTitle(String title) { mTitle = title; }
}

我的测试失败了:

    //Create new object and save it to DDBB
    TItem r = new TItem();
    r.save();

    TItem saved = new Select().from(TItem.class).where("id=?", r.getId()).executeSingle();
    //Value for saved.getTitle() = null  --> OK

    r.setTitle("Hello");
    r.save();
    saved = new Select().from(TItem.class).where("id=?", r.getId()).executeSingle();
    //Value for saved.getTitle() = "Hello"  --> OK

    r.setTitle(null);
    r.save();
    saved = new Select().from(TItem.class).where("id=?", r.getId()).executeSingle();
    //Value for saved.getTitle() = "Hello"  --> FAIL

看来我无法在ActiveAndroid中将列值从任何值更改为null。 很奇怪。 是虫子吗? 我没有找到任何关于它的东西,但是看起来很基本。

如果我调试应用程序并遵循保存方法,则它到达的最后一个命令在SQLLiteConnection.java中:

private void bindArguments(PreparedStatement statement, Object[] bindArgs) {
    ....
    // It seems ok, as it is really inserting a null value in the DDBB
    case Cursor.FIELD_TYPE_NULL:
        nativeBindNull(mConnectionPtr, statementPtr, i + 1);
    ....
}

我看不到进一步,因为“ nativeBindNull”不可用

===============>>#1 票数:2 已采纳

最后,我发现了发生的情况,问题出在ActiveAndroid库中。

空值会正确保存到DDBB,但不会正确检索。 由于ActiveAndroid使用缓存的项目,因此在获取元素时,它会获取“旧版本”并使用新值对其进行更新。 这是库失败的地方,因为正在检查如果不为null则替换该值,否则为空。

为了解决这个问题,我们必须从库中的Model.java类中更改它:

public final void loadFromCursor(Cursor cursor) {

    List<String> columnsOrdered = new ArrayList<String>(Arrays.asList(cursor.getColumnNames()));
    for (Field field : mTableInfo.getFields()) {
        final String fieldName = mTableInfo.getColumnName(field);
        Class<?> fieldType = field.getType();
        final int columnIndex = columnsOrdered.indexOf(fieldName);
        ....

        if (columnIsNull) {
            <strike>field = null;</strike> //Don't put the field to null, otherwise we won't be able to change its content
            value = null;
        }

        ....

        <strike>if (value != null)</strike> {   //Remove this check, to always set the value
            field.set(this, value);
        }
        ....
    }
    ....
}

  ask by Corbella translate from so

未解决问题?本站智能推荐:

2回复

ActiveAndroid不保存表

我正在使用ActiveAndroid库来使用数据库,但是当我尝试保存对象时,它说没有这样的表。 我尝试过更新数据库版本并卸载我的应用程序,但是仍然没有运气。 任何帮助将不胜感激。 谢谢! 这些是错误: 这是我的代码: AlarmModel.java (GenericMo
1回复

ActiveAndroid:未创建日期列

我试图用ActiveAndroid存储一个Person对象。 我设置了这样的生日: person.setBirthdate(new java.sql.Date((new Date()).getTime())); 。 在分配我正在调用person.save();所有数据之后person.sa
3回复

使用activeAndroid更新多列

我想用活动的android更新单行的多个单元格。 这样的事情 但这会给我错误。 还有其他方法吗? 还是我错过了什么? 这是我的Question.class供参考
2回复

ActiveAndroid-如何将数据保存到Android数据库

我有一个Android应用程序,正在从API获取数据。 现在,我需要将这些数据从API保存到ActiveAndroid表中。 所以我被困在那部分上。 这是我的表格合作伙伴(Active Android): 这是我的POJO模型: 这是代码的一部分,我在其中获取数据并
1回复

ActiveAndroid架构迁移添加列是一个对象

我对SQLite和ActiveAndroid相当陌生。 我正在努力为应用程序发布更新,并且需要迁移我的数据库。 一些表具有添加或删除的列等。在ActiveAndroid中,架构迁移是通过编写迁移脚本来执行的。 我很容易理解在处理基本数据类型时如何执行此操作,但是我很困惑如何添加映射到其
1回复

如何使用某些值初始化数据库

我正在使用ActiveAndroid作为ORM。 我想用某些值初始化数据库表。只有一次,我不想重复内容。 还是有解决方案在安装时执行sql脚本。 我搜索了文档,但没有找到。 谢谢。
3回复

ActiveAndroid多对多的关系

我目前正在使用ActiveAndroid,过去几个小时一直试图让多对多的关系工作,但是我无法让它工作。 我希望你能帮助我: 我有模特“学生”和“课程”,学生可以有很多课程,课程有很多学生。 基本上这就是我在模型“StudentCourse”中所拥有的: 现在我正在尝试做的是“课
1回复

ActiveAndroid.beginTransaction()和多线程

我有多个列表,希望使用activeAndroid以多线程方式存储在sqlite数据库中。 我为要保留的每个列表运行一个线程。 每个线程的主体看起来像这样。 事务似乎为数据库添加了锁,因为每个线程都一个接一个地运行。 如果不使用事务,事情将按预期工作,但是任务相当缓慢( 最慢
1回复

ActiveAndroid从类中选择所有

我想做最简单的查询,但无法在网上找到如何在活动的android中做到这一点。 我有一个Items表,我只想获取所有项目,但我的查询只返回一个。 我的结果列表始终是我保存的最后一项。 我怎样才能获得表格中的所有项目?
2回复

ActiveAndroid中的多参数

我在我的项目中使用ActiveAndroid作为ORM系统,我使用这行代码进行Query over database 但它获取0行作为结果。 我确信我在数据库中有这样的行。