gpt4 book ai didi

Android OrmLite - queryForId() 方法中的 OOM 错误

转载 作者:行者123 更新时间:2023-11-29 14:14:43 25 4
gpt4 key购买 nike

我在我的 Android 应用程序中使用 OrmLite 和 SQLite 数据库。目前我正在处理 queryForId(String arg0) 方法中发生的 OOM 错误。

堆栈跟踪:

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841) Caused by: java.lang.OutOfMemoryError
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:438)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at com.j256.ormlite.android.AndroidDatabaseResults.getString(AndroidDatabaseResults.java:134)
at com.j256.ormlite.field.types.StringType.resultToSqlArg(StringType.java:39)
at com.j256.ormlite.field.BaseFieldConverter.resultToJava(BaseFieldConverter.java:24)
at com.j256.ormlite.field.FieldType.resultToJava(FieldType.java:819)
at com.j256.ormlite.stmt.mapped.BaseMappedQuery.mapRow(BaseMappedQuery.java:60)
at com.j256.ormlite.android.AndroidDatabaseConnection.queryForOne(AndroidDatabaseConnection.java:196)
at com.j256.ormlite.stmt.mapped.MappedQueryForId.execute(MappedQueryForId.java:38)
at com.j256.ormlite.stmt.StatementExecutor.queryForId(StatementExecutor.java:85)
at com.j256.ormlite.dao.BaseDaoImpl.queryForId(BaseDaoImpl.java:223)
at com.myapp.db.DatabaseManager.getResponseWithId(DatabaseManager.java:123)
at com.myapp.async.AsyncBaseProxy$ExecuteBaseProxyTask.doInBackground(AsyncBaseProxy.java:321)
at com.myapp.async.AsyncBaseProxy$ExecuteBaseProxyTask.doInBackground(AsyncBaseProxy.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
... 3 more

DatabaseManager.java

synchronized public Response getResponseWithId(String idExt) {
Response response = null;
try {
response = getHelper().getResponseDao().queryForId(idExt);
} catch (SQLException e) {
e.printStackTrace();
}
return response;
}

行号 123 在哪里

response = getHelper().getResponseDao().queryForId(idExt);

我在 AsyncTask 中执行上述方法。

DatabaseHelper.java

public Dao<Response, String> getResponseDao() {
if (null == responseDao) {
try {
responseDao = getDao(Response.class);
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
}
return responseDao;
}

响应.java

@DatabaseTable
public class Response {

@DatabaseField(id = true)
private String id;
@DatabaseField
private String response;
@DatabaseField
private long lastTime;
@DatabaseField
private boolean isNeedForRefresh;
@DatabaseField
private int errorCode;
@DatabaseField
private String eTag;

private boolean notModified;
private SuccessObject success;

public Response() {
}

public Response(String id) {
this.id = id;
this.errorCode = -1;
}

/** Getters and setters below **/

}

知道如何解决这个问题吗?我可以做什么优化?
提前致谢。

最佳答案

SQLite 不是线程安全的。所以你必须只在主线程中调用 sqlite 函数。看看:http://www.sqlite.org/faq.html#q6

关于Android OrmLite - queryForId() 方法中的 OOM 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25177994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com