【问题标题】:ORMLite iterating over ForeignCollection throws the exceptionORMLite 迭代 ForeignCollection 抛出异常
【发布时间】:2013-02-17 01:31:55
【问题描述】:

我尝试迭代 ForeignCollection<OrderItems>。如果 eager 设置为 true 则此方法有效,但惰性选项仍然无效。

首先,我做

OrderDataSource orderDS = new OrderDataSource(getAppContext());
ws.Order order = orderDS.convertToWS(mOrder,ws.Order.class);
orderDS.close();

close() 关闭数据库连接,convertToWS() 进行迭代。

convertToWS()的一部分:

Iterator<OrderItem> itr = order.getOrderItems().iterator();

while (itr.hasNext())
{
    OrderItem orderItem = itr.next();
    ...
}

方法 close 在从convertToWS() 返回后被调用。我在convertToWS() 中处理其他对象时遇到任何问题。

我也尝试使用CloseableIterator 并在finally 块中关闭它,但没有成功。期待这个,我没有关闭连接。

例外:

02-17 02:21:43.094: E/AndroidRuntime(4820): FATAL EXCEPTION: main
02-17 02:21:43.094: E/AndroidRuntime(4820): java.lang.IllegalStateException: database /data/data/my_app/databases/my_db (conn# 0) already closed
02-17 02:21:43.094: E/AndroidRuntime(4820):     at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2082)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1556)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1538)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.android.AndroidCompiledStatement.getCursor(AndroidCompiledStatement.java:162)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.android.AndroidCompiledStatement.runQuery(AndroidCompiledStatement.java:57)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.stmt.SelectIterator.<init>(SelectIterator.java:55)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:232)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.dao.BaseDaoImpl.createIterator(BaseDaoImpl.java:933)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.dao.BaseDaoImpl.iterator(BaseDaoImpl.java:531)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.dao.BaseDaoImpl.iterator(BaseDaoImpl.java:526)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.dao.LazyForeignCollection.seperateIteratorThrow(LazyForeignCollection.java:74)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.dao.LazyForeignCollection.iteratorThrow(LazyForeignCollection.java:60)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.dao.LazyForeignCollection.closeableIterator(LazyForeignCollection.java:50)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.dao.LazyForeignCollection.iterator(LazyForeignCollection.java:45)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.j256.ormlite.dao.LazyForeignCollection.iterator(LazyForeignCollection.java:26)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at orders.OrderDataSource.convertToWS(OrderDataSource.java:409)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at fragments.OrderDetailFragment.sendOrder(OrderDetailFragment.java:419)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at fragments.OrderDetailFragment.doPositiveClick(OrderDetailFragment.java:347)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at ui.dialogfragments.AlertDialogFragment$1.onClick(AlertDialogFragment.java:54)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at android.os.Looper.loop(Looper.java:137)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at android.app.ActivityThread.main(ActivityThread.java:4424)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at java.lang.reflect.Method.invokeNative(Native Method)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at java.lang.reflect.Method.invoke(Method.java:511)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-17 02:21:43.094: E/AndroidRuntime(4820):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 当你让它急切获取时会发生什么?
  • 我犯了一个错误,eager 可以正常工作。

标签: java android collections ormlite foreign-collection


【解决方案1】:

您需要打开数据库才能迭代值,因为您正在执行惰性查询,这意味着您在第一次访问外部集合中的对象时从数据库中获取数据。

因此,如果您正在扩展 ORMLiteActivity,那么您的数据库将保持打开状态,直到您销毁该屏幕。

这里的主要内容是在您使用数据时保持助手打开。

【讨论】:

  • 我已经更新了我的问题,我已经添加了有关迭代的详细信息。
  • 所以当你急切地拉你从数据库中获取所有数据时。然后释放该连接,您继续使用内存中的对象。在进行延迟加载时,您只会在内存中获取部分数据,然后在您开始访问集合中的数据时继续拉取其余数据。由于异常状态,当您尝试迭代时您的数据库已关闭,这会阻止将其余数据拉入内存。我不知道为什么会在你的情况下发生这种情况,但我的建议是看看你是否可能在迭代之前以某种方式释放帮助器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2011-10-27
相关资源
最近更新 更多