Android 在从中访问数据之前初始化SQLite游标
我试图在通过FCM收到通知后将数据插入SQLite数据库。出于调试目的,当在主屏幕活动上单击SHow Token时,我还将向我的DB中插入一个虚拟数据 然而,我得到 “我正在获取”无法从游标窗口读取第0行第1列。在从光标访问数据之前,请确保光标已正确初始化。“ 链接到我的代码:- 请有人检查一下我的代码,告诉我哪里出了问题 注意-我在HomeScreen.java、MyFirebaseMessagingService.java和NotificationDetails.java中添加了以下内容 私有SQLiteDB dbHelper=新SQLiteDB(this);Android 在从中访问数据之前初始化SQLite游标,android,sqlite,android-cursoradapter,Android,Sqlite,Android Cursoradapter,我试图在通过FCM收到通知后将数据插入SQLite数据库。出于调试目的,当在主屏幕活动上单击SHow Token时,我还将向我的DB中插入一个虚拟数据 然而,我得到 “我正在获取”无法从游标窗口读取第0行第1列。在从光标访问数据之前,请确保光标已正确初始化。“ 链接到我的代码:- 请有人检查一下我的代码,告诉我哪里出了问题 注意-我在HomeScreen.java、MyFirebaseMessagingService.java和NotificationDetails.java中添加了以下内容 私
自建议的
私有SQLiteDB dbHelper;
没有为我工作
当我在上面使用时,我一直在获取Nullpointer异常,因此我认为由于SQLiteDB类构造函数正在接受一个上下文,所以让我传递一个post,我没有获取Nullpointer异常 现在我在没有完全意识到上下文的概念的情况下做了这件事,我一直在绞尽脑汁,但是由于我是android的一个极端的noob,我现在还不能理解它。我怀疑这可能与我正在传递的上下文有关 有人能在这里帮助我详细说明如何解决这个问题吗?我已经通过了许多其他的线程,但无法解决这个问题,因此经过5个小时的多个SO问题,我发布了这个问题 提前感谢社区中所有人的帮助。:) 编辑 根据管理员的建议,我在下面添加了我的代码片段 我在哪里调用光标 在SQLiteDB.java中插入通知函数 getAllNotifications函数 无法从游标窗口读取第0行第1列。 表示您正试图从第0行(第一行)获取偏移量为-1的列。因此您提供了无效的偏移量(偏移量不能为-1,偏移量必须为0或更大,最大值将比光标中的列数少1) 最可能的原因是,当传递给方法的列在游标中找不到时,游标方法getColumnIndex(列名称作为字符串)将返回-1。注意,由于存在错误,列名区分大小写 因此,您的问题是光标不包含列名通知详细信息,并且由于您使用了*(所有列),因此该列在表中不存在 从外观上看,您应该使用字符串变量NOTIFICATION_DETAILS,因此您可能需要使用:-
token_text.setText("Token: " +rs.getString((rs.getColumnIndex(NOTIFICATION_DETAILS)))); //<<<<<<<<<< double quotation marks removed.
补充和重新评论:-
游标rs=dbHelper.getAllNotifications();rs.moveToFirst();do{for
(int i=0;iCursor rs = dbHelper.getAllNotifications();
while (rs.moveToNext()) {
notification_array.add(rs.getString((rs.getColumnIndex(NOTIFICATION_DETAILS))));
}
无法从游标窗口读取第0行第1列。
表示您正试图从第0行(第一行)获取偏移量为-1的列。因此您提供了无效的偏移量(偏移量不能为-1,偏移量必须为0或更大,最大值将比光标中的列数少1)
最可能的原因是,当传递给方法的列在游标中找不到时,游标方法getColumnIndex(列名称作为字符串)将返回-1。注意,由于存在错误,列名区分大小写
因此,您的问题是光标不包含列名通知详细信息,并且由于您使用了*(所有列),因此该列在表中不存在
从外观上看,您应该使用字符串变量NOTIFICATION_DETAILS,因此您可能需要使用:-
token_text.setText("Token: " +rs.getString((rs.getColumnIndex(NOTIFICATION_DETAILS)))); //<<<<<<<<<< double quotation marks removed.
补充和重新评论:-
游标rs=dbHelper.getAllNotifications();rs.moveToFirst();do{for
(int i=0;iCursor rs = dbHelper.getAllNotifications();
while (rs.moveToNext()) {
notification_array.add(rs.getString((rs.getColumnIndex(NOTIFICATION_DETAILS))));
}
我收到“无法从游标窗口读取第0行第1列”。在从光标访问数据之前,请确保光标已正确初始化。请回答您的问题,而不是发布带有错误消息的注释。还要确保包含完整的代码示例。(注意:我们不是管理员。我们只是堆栈溢出的普通用户,愿意花时间回答问题。)在
moveToFirst()之后注销rs.getCount()
的值。光标有行吗?没有getColumnCount()使用getCount()。您希望循环遍历行数,而不是行中的列数。使用while(rs.moveToNext){….}
要简单得多无法从游标窗口读取第0行第1列。在从光标访问数据之前,请确保光标已正确初始化。请回答您的问题,而不是发布带有错误消息的注释。还要确保包含完整的代码示例。(注意:我们不是管理员。我们只是堆栈溢出的普通用户,愿意花时间回答问题。)在moveToFirst()之后注销rs.getCount()
的值。光标有行吗?没有getColumnCount()使用getCount()。您希望循环遍历行数,而不是行中的列数。使用while(rs.moveToNext){….}
要简单得多
dbHelper.insertNotification("This is a notification");
//Check if the message contains data
Cursor rs = dbHelper.getAllNotifications();
if (rs.moveToFirst()) {
token_text.setText("Token: " +rs.getString((rs.getColumnIndex(NOTIFICATION_DETAILS))));
} else {
........ code here if anything need to be done if there are no rows extracted
}
Cursor rs = dbHelper.getAllNotifications();
while (rs.moveToNext()) {
notification_array.add(rs.getString((rs.getColumnIndex(NOTIFICATION_DETAILS))));
}