- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 asynctask 类 doInBackground() 中初始化数据库实例。数据库实例及其方法位于一个单独的类中(我将展示的类)从 asynctask 中,我在 Azure 客户端的类中启动另一个线程,该线程最终查询数据库类以填充我的 azure db 客户端。回到我的异步任务,然后我再次访问数据库(与第一个查询同时)以查询数据库以获取单独的信息。似乎两个游标同时从不同的线程查询给我带来了问题。
下面是 db 类中的方法,它们使用第一个游标将内容发送到 Azure。这些方法是从 Azure 类中运行的单独线程调用的。 Azure 类在 asynctask 类中调用。正如您将在 logcat 中看到的,这工作得很好。
public ArrayList<WeatherEvent> GetUnsychedWeatherEvent() {
String query = COLUMN_SYNCHED + " = 0 ";
Cursor cursor = db.query(TABLE_WEATHER, null, query, null, null, null, null);
ArrayList<WeatherEvent> unsychedWeather = new ArrayList<>();
while (cursor.moveToNext()) {
unsychedWeather.add( GetWeatherEvent(cursor) );
}
cursor.close();
return unsychedWeather;
}
//get weather event from db for azure
//TODO: finish populating this
public WeatherEvent GetWeatherEvent(Cursor cursor) {
WeatherEvent wEvent = new WeatherEvent();
wEvent.Latitude = cursor.getDouble(cursor.getColumnIndex(COLUMN_LATITUDE));
wEvent.Longitude = cursor.getDouble(cursor.getColumnIndex(COLUMN_LONGITUDE));
wEvent.CurrTemp = cursor.getString(cursor.getColumnIndex(COLUMN_CURRENT_TEMPERATURES));
wEvent.CurrDesc = cursor.getString(cursor.getColumnIndex(COLUMN_CURRENT_WEATHER_DESCRIPTION));
System.out.println("From DB, current temp: " + wEvent.CurrTemp);
try {
wEvent.Time = timeStampFormat.parseDateTime(cursor.getString(cursor.getColumnIndex(COLUMN_TIME_STAMP)));
} catch (Exception e) {
Log.d("GetEvent()", "Error parsing date " + e.toString());
}
return wEvent;
}
接下来的这些方法来自同一个数据库类。这里的“每日光标”给我带来了麻烦。这些方法在 asynctask 类中调用。
public ArrayList<WeatherEvent> DailyWeatherEvents(ArrayList<WeatherEvent> dailyWeatherEvents) {
Log.d("DB Access", "got to dailyweatherevents");
//todo: more specific time query
Cursor dailycursor = db.rawQuery("SELECT avg(" + COLUMN_CURRENT_TEMPERATURES + "), " + COLUMN_TIME_STAMP + ", " +
"CASE WHEN strftime('%M', " + COLUMN_TIME_STAMP + ") < '30' " +
"THEN strftime('%H', " + COLUMN_TIME_STAMP + ") " +
"ELSE strftime('%H', " + COLUMN_TIME_STAMP + ", '+1 hours') END " +
"FROM " + TABLE_WEATHER + " "+
"GROUP BY strftime('%H', " + COLUMN_TIME_STAMP + ", '+30 minutes')", null);
//ArrayList<WeatherEvent> dailyWeatherEvents = new ArrayList<>();
try {
if (dailycursor.moveToFirst()) {
while (dailycursor.moveToNext()) {
dailyWeatherEvents.add(GetDailyWeatherEvent(dailycursor));
}
dailycursor.close();
System.out.println("Size of dailyinfo " + dailyWeatherEvents.size());
}
} catch (Exception e) {
e.printStackTrace();
}
return dailyWeatherEvents;
}
public WeatherEvent GetDailyWeatherEvent(Cursor dailycursor) {
WeatherEvent wEvent = new WeatherEvent();
// wEvent.Latitude = dailycursor.getDouble(dailycursor.getColumnIndex(COLUMN_LATITUDE));
// wEvent.Longitude = dailycursor.getDouble(dailycursor.getColumnIndex(COLUMN_LONGITUDE));
wEvent.CurrTemp = dailycursor.getString(dailycursor.getColumnIndex(COLUMN_CURRENT_TEMPERATURES));
System.out.println(wEvent.CurrTemp + " mariah this comes from cursor");
wEvent.CurrDesc = dailycursor.getString(dailycursor.getColumnIndex(COLUMN_CURRENT_WEATHER_DESCRIPTION));
try {
wEvent.Time = timeStampFormat.parseDateTime(dailycursor.getString(dailycursor.getColumnIndex(COLUMN_TIME_STAMP)));
} catch (Exception e) {
Log.d("GetEvent()", "Error parsing date " + e.toString());
}
wEvent.CurrIcon = dailycursor.getString(dailycursor.getColumnIndex(COLUMN_CURRENT_ICONS));
wEvent.SevereWeatherPresent = dailycursor.getInt(dailycursor.getColumnIndex(COLUMN_SEVERE_WEATHER_PRESENT))>0;
return wEvent;
}
asynctask 类中的行启动了这一切。 WeatherDBAccess 是数据库类。 WeatherAzureAccess 是 azure 的类:
WeatherDBAccess._context = this.context;
WeatherDBAccess.Instance().AddWeatherEvent(wEvent);
//starts azure
WeatherAzureAccess.context = this.context;
WeatherAzureAccess.Instance();
//prep dailyinfo arraylist
dailyinfo = WeatherDBAccess.Instance().DailyWeatherEvents(dailyinfo);
这是我的 logcat,“From DB, current temp: XX”行是从 azure 的方法打印的:
01-12 15:15:43.869 29979-30189/pdgt.cat.com.noaahso I/SQLiteAssetHelper: successfully opened database HSO.sqlite
01-12 15:15:43.869 29979-30189/pdgt.cat.com.noaahso D/WeatherDBAccess: Instance Created /data/data/pdgt.cat.com.noaahso/databases/HSO.sqlite
01-12 15:15:43.869 29979-30189/pdgt.cat.com.noaahso I/System.out: Current Temp: 54
01-12 15:15:43.899 29979-30189/pdgt.cat.com.noaahso I/System.out: Weather Event Added
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso D/DB Access: got to dailyweatherevents
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso E/CursorWindow: Failed to read row 1, column -1 from a CursorWindow which has 3 rows, 3 columns.
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: java.lang.IllegalStateException: Couldn't read row 1, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso D/AzureAccess: WeatherSync thread STARTED!
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at android.database.CursorWindow.nativeGetString(Native Method)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at android.database.CursorWindow.getString(CursorWindow.java:451)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at pdgt.cat.com.noaahso.WeatherDBAccess.GetDailyWeatherEvent(WeatherDBAccess.java:235)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at pdgt.cat.com.noaahso.WeatherDBAccess.DailyWeatherEvents(WeatherDBAccess.java:219)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at pdgt.cat.com.noaahso.WeatherTask.doInBackground(WeatherTask.java:228)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at pdgt.cat.com.noaahso.WeatherTask.doInBackground(WeatherTask.java:47)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:288)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 49
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-12 15:15:43.919 29979-30189/pdgt.cat.com.noaahso W/System.err: at java.lang.Thread.run(Thread.java:818)
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 49
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 49
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 49
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 50
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 50
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 50
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 51
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 51
01-12 15:15:43.919 29979-29979/pdgt.cat.com.noaahso D/AsyncTask: got to onpostExecute
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 51
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 51
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 51
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 51
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 51
01-12 15:15:43.919 29979-30298/pdgt.cat.com.noaahso I/System.out: From DB, current temp: 51
我是否需要在第一个游标上使用 FutureCallback 才能知道何时启动第二个游标?或者我是否需要将第一个游标设置为全局并等到第一个查询完成后再重置一个游标以执行第二个查询?在寻找解决方案时,我了解到启动第二个光标的成本很高。我的问题是,第二个游标很少使用(可能仅在 onCreate() 上),而第一个游标几乎总是会使用,因为它经常用于向 Azure 发送内容。另外仅供引用,我关闭了我的数据库 onDestroy()。
最佳答案
首先,您的错误是:
java.lang.IllegalStateException: Couldn't read row 1, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
这意味着您有结果(第 1 行),但您正在尝试读取无效的列索引(col -1)。
问题区域可能在这里:
wEvent.CurrTemp = dailycursor.getString(dailycursor.getColumnIndex(COLUMN_CURRENT_TEMPERATURES));
您从 getColumnIndex
得到 -1 结果,因为您的 SQL 查询中不存在 COLUMN_CURRENT_TEMPERATURES
。
Cursor dailycursor = db.rawQuery("SELECT avg(" + COLUMN_CURRENT_TEMPERATURES + "), " + COLUMN_TIME_STAMP + ", " +
"CASE WHEN strftime('%M', " + COLUMN_TIME_STAMP + ") < '30' " +
"THEN strftime('%H', " + COLUMN_TIME_STAMP + ") " +
"ELSE strftime('%H', " + COLUMN_TIME_STAMP + ", '+1 hours') END " +
"FROM " + TABLE_WEATHER + " "+
"GROUP BY strftime('%H', " + COLUMN_TIME_STAMP + ", '+30 minutes')", null);
您需要在 SELECT 语句中包含您想要读取的所有列:
Cursor dailycursor = db.rawQuery("SELECT avg(" + COLUMN_CURRENT_TEMPERATURES + "), " + COLUMN_CURRENT_TEMPERATURES + ", " + COLUMN_CURRENT_WEATHER_DESCRIPTION + ", " + COLUMN_CURRENT_ICONS + ", " + COLUMN_SEVERE_WEATHER_PRESENT + ", " + COLUMN_TIME_STAMP + ", " +
"CASE WHEN strftime('%M', " + COLUMN_TIME_STAMP + ") < '30' " +
"THEN strftime('%H', " + COLUMN_TIME_STAMP + ") " +
"ELSE strftime('%H', " + COLUMN_TIME_STAMP + ", '+1 hours') END " +
"FROM " + TABLE_WEATHER + " "+
"GROUP BY strftime('%H', " + COLUMN_TIME_STAMP + ", '+30 minutes')", null);
关于java - 在同一数据库上运行的不同线程中的多个游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34769916/
我有 table 像这样 -------------------------------------------- id size title priority
我的应用在不同的 Activity (4 个 Activity )中仅包含横幅广告。所以我的疑问是, 我可以对所有横幅广告使用一个广告单元 ID 吗? 或者 每个 Activity 使用不同的广告单元
我有任意(但统一)数字列表的任意列表。 (它们是 n 空间中 bin 的边界坐标,我想绘制其角,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2], [3,4],[5,6]] 产生 [[1
我刚刚在学校开始学习 Java,正在尝试自定义控件和图形。我目前正在研究图案锁,一开始一切都很好,但突然间它绘制不正确。我确实更改了一些代码,但是当我看到错误时,我立即将其更改回来(撤消,ftw),但
在获取 Distinct 的 Count 时,我在使用 Group By With Rollup 时遇到了一个小问题。 问题是 Rollup 摘要只是所有分组中 Distinct 值的总数,而不是所有
这不起作用: select count(distinct colA, colB) from mytable 我知道我可以通过双选来简单地解决这个问题。 select count(*) from (
这个问题在这里已经有了答案: JavaScript regex whitespace characters (5 个回答) 2年前关闭。 你能解释一下为什么我会得到 false比较 text ===
这个问题已经有答案了: 奥 git _a (56 个回答) 已关闭 9 年前。 我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应此测试: // Does not cras
所以,我不得不说,SQL 是迄今为止我作为开发人员最薄弱的一面。也许我想要完成的事情很简单。我有这样的东西(这不是真正的模型,但为了使其易于理解而不浪费太多时间解释它,我想出了一个完全模仿我必须使用的
这个问题在这里已经有了答案: How does the "this" keyword work? (22 个回答) 3年前关闭。 简而言之:为什么在使用 Objects 时,直接调用的函数和通过引用传
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: what is the difference between (.) dot operator and (-
我真的不明白这里发生了什么但是: 当我这样做时: colorIndex += len - stopPos; for(int m = 0; m < len - stopPos; m++) { c
思考 MySQL 中的 Group By 函数的最佳方式是什么? 我正在编写一个 MySQL 查询,通过 ODBC 连接在 Excel 的数据透视表中提取数据,以便用户可以轻松访问数据。 例如,我有:
我想要的SQL是这样的: SELECT week_no, type, SELECT count(distinct user_id) FROM group WHERE pts > 0 FROM bas
商店表: +--+-------+--------+ |id|name |date | +--+-------+--------+ |1 |x |Ma
对于 chrome 和 ff,当涉及到可怕的 ie 时,这个脚本工作完美。有问题 function getY(oElement) { var curtop = 0; if (oElem
我现在无法提供代码,因为我目前正在脑海中研究这个想法并在互联网上四处乱逛。 我了解了进程间通信和使用共享内存在进程之间共享数据(特别是结构)。 但是,在对保存在不同 .c 文件中的程序使用 fork(
我想在用户集合中使用不同的功能。在 mongo shell 中,我可以像下面这样使用: db.users.distinct("name"); 其中名称是用于区分的集合字段。 同样我想要,在 C
List nastava_izvjestaj = new List(); var data_context = new DataEvidencijaDataContext();
我的 Rails 应用程序中有 Ransack 搜索和 Foundation,本地 css 渲染正常,而生产中的同一个应用程序有一个怪癖: 应用程序中的其他内容完全相同。 我在 Chrome 和 Sa
我是一名优秀的程序员,十分优秀!