java.lang.IllegalStateException:从第0行col 25获取字段槽失败

时间:2014-08-18 08:59:31

标签: android database sqlite greendao

我正在尝试使用GreenDAO创建一个Android应用程序,这是ERP类项目所以实际上不可能在这里发布所有代码,但我将只分享相关代码

    QueryBuilder<PartyCommunication> partyCommQueryBuilder = partyCommunicationDao.queryBuilder();
   partyCommQueryBuilder = partyCommQueryBuilder.where(
        PartyCommunicationDao.Properties.CommType.eq("ALERT"), 
        PartyCommunicationDao.Properties.ReferenceCategory.eq("Low Stock"));
   List<PartyCommunication> listOfPartyComm = partyCommQueryBuilder.list();

   PartyCommunication daoPartyCommunication = listItr.next();
   Long reference_entity_key = daoPartyCommunication.getReferenceEntityKey();       
   Product product = daoSessionUni.getProductDao().load(reference_entity_key);
   ProductDetail productDetail = new ProductDetail(product);
   Integer inventoryQOH= productDetail.getInventoryQOH(); 

我在这一行中遇到异常

  Product product = daoSessionUni.getProductDao().load(reference_entity_key);

当我调试我们的应用程序时,我发现它从我们的一个DAO类中抛出异常,如下所示

         public Product readEntity(Cursor cursor, int offset) {
    Product entity = new Product( //
        .
        .
        .
        .
        cursor.getShort(offset + 23) != 0, // isSync
        cursor.getShort(offset + 24) != 0, // isDeleted
        cursor.getString(offset + 25), // createdBy
        cursor.getString(offset + 26), // modifiedBy
        cursor.isNull(offset + 27) ? null : new java.util.Date(cursor.getLong(offset + 27)), // lastSyncTime
        new java.util.Date(cursor.getLong(offset + 28)), // created
        new java.util.Date(cursor.getLong(offset + 29)) // modified
    );
    return entity;
}

在这一行

  cursor.getString(offset + 25), // createdBy

这是我们的第25列表。我知道所有代码都不足以理解出现了什么问题以及为什么我会得到这个异常,所以我也要发布logcat输出

     java.lang.IllegalStateException: get field slot from row 0 col 25 failed
at net.sqlcipher.CursorWindow.getString_native(Native Method)
at net.sqlcipher.CursorWindow.getString(CursorWindow.java:382)
at net.sqlcipher.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at android.database.CursorWrapper.getString(CursorWrapper.java:114)
at com.tarnea.kareeb.model.ProductDao.readEntity(ProductDao.java:273)
at com.tarnea.kareeb.model.ProductDao.readEntity(ProductDao.java:1)
at de.greenrobot.dao.AbstractDao.loadCurrent(AbstractDao.java:417)
at de.greenrobot.dao.AbstractDao.loadUnique(AbstractDao.java:163)
at de.greenrobot.dao.AbstractDao.loadUniqueAndCloseCursor(AbstractDao.java:150)
at de.greenrobot.dao.AbstractDao.load(AbstractDao.java:139)
at com.tarnea.android.DataCleaningService.adjustLowStockAlertTable(DataCleaningService.java:115)
at com.tarnea.sync.kareeb.pharma.syncadapter.SyncManager.performSync(SyncManager.java:970)
at com.tarnea.sync.kareeb.pharma.syncadapter.SyncAdapter.onPerformSync(SyncAdapter.java:96)
at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:254

提前感谢所有人。如果有人有兴趣解决我的问题,那么请随时询问任何进一步的信息。

1 个答案:

答案 0 :(得分:0)

您的问题不是查询。 SQLite-Table只包含24列。

您可能通过添加createdBy等新列来修改数据库架构。

  1. 您忘记使用OpenHelper
  2. 更新数据库
  3. 或者您的ALTER TABLE - 陈述
  4. 中有错误
  5. 或者您使用新架构版本运行了您的应用程序,但尚未包含ALTER TABLE - 语句(实际上与1相同。
  6. 使用SqliteManager查看您的数据库,以验证您的表是否具有您期望的列。

    如果您无法获取数据库文件,则只需删除包含所有数据的应用程序或增加模式版本,然后使用DevOpenHelper重新创建整个数据库。