ORMLite ForeignCollection:必须使用ClosableIterator吗?

din*_*eth 3 java android dao ormlite foreign-collection

关于使用ORMLite的快速问题.我正在努力确保我的实施是正确的.有一部分文档讨论了closableIterators以及如何访问它加载了LazyForeignCollection类,需要关闭(或读到最后)才能关闭数据库连接:

注:像与Dao.iterator()方法,当你用它做,因为那里是下打开数据库的连接被延迟集合返回的迭代器必须关闭.如果你通过迭代器一直走,或者你在它上面调用close(),则会发生结束.只有ForeignCollection返回一个可关闭的迭代器.

所以我的问题很简单:只能通过closableIterator访问集合吗?我可以像使用任何其他Java集合一样使用Collection/ForeignCollection对象而不用担心数据库连接的东西(例如:foreach循环)吗?

Gra*_*ray 6

我认为文档足以解释这一点.问题是当您完成连接时需要关闭,否则与SQL数据库的连接将保持打开状态.如果你使用一个for (Account account : accountDao)类型的图案则连接将如果你去关闭所有的方式通过该表.如果你使用一个break或其他语句(return,goto,exception等)来中断循环,那么ORMLite将不会自动关闭连接.

如果要打破循环,则在文档中指定要使用的正确模式. http://ormlite.com/docs/iterator

CloseableIterator<Account> iterator = accountDao.closeableIterator();
try {
    while (iterator.hasNext()) {
        Account account = iterator.next();
        ...
    }
} finally {
    iterator.close();
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用"wrapped iterable",它允许您使用for循环在finally中关闭.

CloseableWrappedIterable<Account> wrappedIterable =
    accountDao.getWrappedIterable();
try {
    for (Account account : wrappedIterable) {
        ...
    }
} finally {
    wrappedIterable.close();
}
Run Code Online (Sandbox Code Playgroud)