我试图从我的数据库中获取数据。
这是我的代码:
String[] columns = new String[] {COLUMN_FACEBOOK_ALBUM_COVER, COLUMN_FACEBOOK_ALBUM_IS_ACTIVE};
String whereClause = COLUMN_FACEBOOK_ALBUM_IS_ACTIVE + "= '" + 1 + "'";
Cursor cAlbum = ourDatabase.query(TABLE_FACEBOOK, columns, whereClause,null, null, null, null);
columns = new String[] {COLUMN_FACEBOOK_BIG_IMAGE, COLUMN_FACEBOOK_IMAGE_IS_ACTIVE};
whereClause = COLUMN_FACEBOOK_IMAGE_IS_ACTIVE + "= '" + 1 + "'";
Cursor cImage = ourDatabase.query(TABLE_FACEBOOK_IMAGES, columns, null,null, null, null, null);
String[] list = new String[cAlbum.getCount()+cImage.getCount()];
int p = 0;
if(cAlbum.getCount() < 1 && cImage.getCount() < 1)
{
cAlbum.close();
cImage.close();
return null;
}
Log.i("cImage length", cImage.getCount()+"");
Log.i("cAlbum length", cAlbum.getCount()+"");
Log.i("list length", list.length+"");
int i = cImage.getColumnIndex(COLUMN_FACEBOOK_BIG_IMAGE);
int j = cAlbum.getColumnIndex(COLUMN_FACEBOOK_ALBUM_COVER);
for (cAlbum.moveToFirst(); !cAlbum.isAfterLast(); cAlbum.moveToNext())
{
list[p] = cAlbum.getString(j);
p++;
}
for (cImage.moveToFirst(); !cImage.isAfterLast(); cImage.moveToNext())
{
list[p] = cImage.getString(i);
Log.i("image length", list[p].length()+"");
p++;
}
cAlbum.close();
cImage.close();
return list;
代码在此行上失败:
list[p] = cImage.getString(i);
错误消息是:
11-27 12:34:59.683: E/CursorWindow(6901): Failed to read row 2, column 0 from a CursorWindow which has 2 rows, 2 columns.
11-27 12:34:59.683: D/AndroidRuntime(6901): Shutting down VM
11-27 12:34:59.683: W/dalvikvm(6901): threadid=1: thread exiting with uncaught exception (group=0x41e9b930)
11-27 12:34:59.693: E/AndroidRuntime(6901): FATAL EXCEPTION: main
11-27 12:34:59.693: E/AndroidRuntime(6901): java.lang.RuntimeException: Unable to create service com.example.imageswidget.WidgetService: java.lang.IllegalStateException: Couldn't read row 2, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2667)
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.app.ActivityThread.access$1600(ActivityThread.java:153)
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.os.Handler.dispatchMessage(Handler.java:99)
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.os.Looper.loop(Looper.java:137)
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.app.ActivityThread.main(ActivityThread.java:5227)
11-27 12:34:59.693: E/AndroidRuntime(6901): at java.lang.reflect.Method.invokeNative(Native Method)
11-27 12:34:59.693: E/AndroidRuntime(6901): at java.lang.reflect.Method.invoke(Method.java:511)
11-27 12:34:59.693: E/AndroidRuntime(6901): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
11-27 12:34:59.693: E/AndroidRuntime(6901): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
11-27 12:34:59.693: E/AndroidRuntime(6901): at dalvik.system.NativeStart.main(Native Method)
11-27 12:34:59.693: E/AndroidRuntime(6901): Caused by: java.lang.IllegalStateException: Couldn't read row 2, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.database.CursorWindow.nativeGetString(Native Method)
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.database.CursorWindow.getString(CursorWindow.java:434)
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
11-27 12:34:59.693: E/AndroidRuntime(6901): at com.example.imageswidget.DataBaseMain.getFacebookImagesForWidget(DataBaseMain.java:943)
11-27 12:34:59.693: E/AndroidRuntime(6901): at com.example.imageswidget.WidgetService.onCreate(WidgetService.java:51)
11-27 12:34:59.693: E/AndroidRuntime(6901): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2657)
11-27 12:34:59.693: E/AndroidRuntime(6901): ... 10 more
对于通话记录
Log.i("image length", list[p].length()+"");
在代码中断之前我接到几个电话。 问题似乎只发生在某些行上,但错误代码并没有告诉我问题是什么。
感谢您的帮助。
答案 0 :(得分:11)
在我的情况下,这是因为我没有在传递到CursorLoader构造函数的投影中包含该列。这意味着我试图从返回的游标中不存在的列中访问数据。
我希望这有助于某人...
答案 1 :(得分:5)
之前我遇到过同样的例外。在我的情况下,原因是包含太多数据的数据库单元格(一个巨大的字符串)。从代码判断(COLUMN_FACEBOOK_BIG_IMAGE)我猜你遇到了同样的问题。 解决方法是检查放入DB的字符串的大小(并在需要时向下缩放图像)。 希望这有帮助!
答案 2 :(得分:2)
也许您正在使用旧数据库。如果您更改了数据库中的某些表,字段,并且您现在正在尝试其他设备(在数据库更改之前已经安装了应用程序),则只应删除旧数据库并创建新文件。
答案 3 :(得分:2)
您应该解决此问题以解决以下错误消息
无法从CursorWindow读取第0行,col -1。确保光标 在从中访问数据之前已正确初始化。
它适用于我的代码。
尝试将光标放在moveToFirst
之前,然后再从中读取数据。
检查null-&gt; if (c != null && c.moveToFirst()) {}
检查count-&gt; (c != null && c.getCount() >0 && c.moveToFirst()){}
答案 4 :(得分:1)
在使用光标之前尝试调用cursor.moveToFirst ()
。如果有效,请告诉我。
答案 5 :(得分:0)
我和Oladipo Olasemo有类似的答案,但我遇到了v-tables以及我是如何解决这个问题的。我相信这是分享我对这个错误的经验的最佳帖子,特别是处理FTS3虚拟表,至少在我的情况下。关于这一点有很多问题,OP的原始问题过于笼统,所以这是我对这个问题的看法。
由于虚拟表中的某些限制,我遇到了这个错误:
create virtual table V1 using FTS3 (content="MyTable", content1, content2);
当我在content1或content2上搜索特定关键字时,我意识到我是通过此查询在虚拟表上进行查询:
select * from V1 where V1 match 'hello'
由于这是一个我错过的虚拟表,它将根据你构建v表本身的方式来投影结果集。因此它只有content1和content2的列。
我正在开发一个Android应用程序,它从搜索结果中查询并在从结果集中选择项目时,我的后端处理处理所选项目并查询列集中不存在的信息。因此,给我这个错误。
我解决这个问题的方法,虽然不是那么精彩,但是要从v表中查询结果,以获得每个项目的ID,它始终具有。然后我从我获得的结果ID构造一个查询字符串库,然后使用它来检索我需要的投影所需的数据。我从这个question
得到了一个想法我相信还有很多方法可以解决这个错误。我花了差不多一个小时搞清楚可能导致这种情况的原因。对我来说,日志上投射的错误不是很有帮助。如果你真的知道应用程序中数据的流动方式,这确实很有帮助。
答案 6 :(得分:-1)
在数据库事务中初始化游标。
Cursor cAlbum = null, cImage = null;
db.beginTransaction();
try {
// init cursors
cAlbum = db.query(...);
cImage = db.query(...);
} catch(SQLException e) {
e.printStackTrace();
} finally {
db.endTransaction();
}
检查游标是否为空。
if(cAlbum != null && cImage != null) {
while(cAlbum.moveToNext()) {
// get data from cAlbum and do what you need
}
while(cImage.moveToNext()) {
// get data from cImage and do what you need
}
cAlbum.close();
cImage.close();
}