我对ORMlite Where#in
有疑问。基本上我希望这接受一个ORM映射bean列表并在子句中使用它们的id。但它似乎没有这样做。
如果我传入一个List<Long>
作为第二个参数,该列表只包含id,一切顺利。
如果我使用原始Element
传入列表,我会:
getElementFromDatabase() / No element with properly properties with this id in DB.
getElements() / Can't get elements.
java.sql.SQLException: Problems executing Android query: SELECT * FROM `elements` WHERE `_id` IN (com.mypackage.myapp.database.Element@417ff150 )
at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
at com.j256.ormlite.android.AndroidCompiledStatement.getCursor(AndroidCompiledStatement.java:184)
at com.j256.ormlite.android.AndroidCompiledStatement.runQuery(AndroidCompiledStatement.java:65)
at com.j256.ormlite.stmt.SelectIterator.<init>(SelectIterator.java:55)
at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:247)
at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:196)
at com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:265)
at com.j256.ormlite.stmt.QueryBuilder.query(QueryBuilder.java:361)
at com.mypackage.myapp.presentation.DatabaseManager.getElements(DatabaseManager.java:248)
at com.mypackage.myapp.presentation.DatabaseManager.getElementsByState(DatabaseManager.java:305)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)
Caused by: android.database.sqlite.SQLiteException: near ".": syntax error: , while compiling: SELECT * FROM `elements` WHERE `_id` IN (com.mypackage.myapp.database.Elements@417ff150 )
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:127)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:53)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1570)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1542)
at com.j256.ormlite.android.compat.BasicApiCompatibility.rawQuery(BasicApiCompatibility.java:15)
at com.j256.ormlite.android.AndroidCompiledStatement.getCursor(AndroidCompiledStatement.java:180)
班级Element
包含以下内容:
@DatabaseTable(tableName = Constants.TABLE_ELEMENTS)
public class Element implements Serializable
{
@DatabaseField(columnName = Constants.COL_ELEMENTS_KEY_ID, id = true)
private long _id;
它可以是注释的东西吗?我是否按预期使用该方法?
编辑请求的两段代码:
List<Element> elements =....;
where.in(Constants.SET_ELEMENTS_ID, elements);
以上内容在问题的第一个版本中引发了异常。
List<Element> elements =....;
List<Long> ids = new ArrayList<Long>();
for (Element element: elements) {
ids.add(element.getId();
}
where.in(Constants.SET_ELEMENTS_ID, ids);
按需工作,但很麻烦。