Java 无法从包含3行3列的游标窗口中读取第0行第3列
我知道以前有人问过这个问题,但我似乎在其他帖子中找不到答案。我有一个错误“无法从一个有3行3列的游标窗口中读取第0行第3列”,以及“无法从游标窗口中读取第0行第3列”。我正在尝试为Android制作一个待办事项列表。我不确定为什么会出现这个错误,因为我知道我的数据库有4列(0到3),就像错误说的那样,我正在尝试读取第0行第3列(这应该是可能的,因为有3列),但它仍然会给我错误。下面是代码(它在文件中分开,我将把文件放在错误首先发生的位置(顺便说一句,它在:Java 无法从包含3行3列的游标窗口中读取第0行第3列,java,android,database,Java,Android,Database,我知道以前有人问过这个问题,但我似乎在其他帖子中找不到答案。我有一个错误“无法从一个有3行3列的游标窗口中读取第0行第3列”,以及“无法从游标窗口中读取第0行第3列”。我正在尝试为Android制作一个待办事项列表。我不确定为什么会出现这个错误,因为我知道我的数据库有4列(0到3),就像错误说的那样,我正在尝试读取第0行第3列(这应该是可能的,因为有3列),但它仍然会给我错误。下面是代码(它在文件中分开,我将把文件放在错误首先发生的位置(顺便说一句,它在:String taskrementer=
String taskrementer=cursor.getString(rementercolumnidex);
希望你们能帮助我,很抱歉问了一个以前被问过的问题,但是我在其他帖子里找不到答案
编辑:我认为这是您需要的代码:
CatalogActivity.java
some imports...
public class CatalogActivity extends AppCompatActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
private static final int TASK_LOADER = 0;
CursorAdapter mCursorAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_catalog);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(CatalogActivity.this, EditorActivity.class);
startActivity(intent);
}
});
ListView taskListView = findViewById(R.id.list);
View emptyView = findViewById(R.id.empty_view);
taskListView.setEmptyView(emptyView);
mCursorAdapter = new CursorAdapter(this, null);
taskListView.setAdapter(mCursorAdapter);
taskListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Intent intent = new Intent(CatalogActivity.this, EditorActivity.class);
Uri currentTaskUri = ContentUris.withAppendedId(Entry.CONTENT_URI, id);
intent.setData(currentTaskUri);
startActivity(intent);
}
});
getLoaderManager().initLoader(TASK_LOADER, null, this);
}
private void deleteAllTasks() {
int rowsDeleted = getContentResolver().delete(Entry.CONTENT_URI, null, null);
Log.v("CatalogActivity", rowsDeleted + " rows deleted from task database");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_catalog, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_insert_dummy_data:
insertTask();
return true;
case R.id.action_delete_all_entries:
deleteAllTasks();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
String[] projection = {
Entry._ID,
Entry.COLUMN_TASK_NAME,
String.valueOf(Entry.COLUMN_TASK_COMPLETED)};
return new CursorLoader(this, // Parent activity context
Entry.CONTENT_URI, // Provider content URI to query
projection, // Columns to include in the resulting Cursor
null, // No selection clause
null, // No selection arguments
null); // Default sort order
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mCursorAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mCursorAdapter.swapCursor(null);
}
}
一些导入。。。
公共类CatalogActivity扩展了AppCompatActivity实现
LoaderManager.LoaderCallbacks{
私有静态最终整型任务\u加载程序=0;
游标适配器mCursorAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_目录);
FloatingActionButton fab=findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
意向意向=新意向(CatalogActivity.this、EditorActivity.class);
星触觉(意向);
}
});
ListView任务ListView=findViewById(R.id.list);
视图emptyView=findViewById(R.id.empty\u视图);
taskListView.setEmptyView(emptyView);
mCursorAdapter=新游标适配器(此为空);
setAdapter(mCursorAdapter);
taskListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView AdapterView,视图视图,整型位置,长id){
意向意向=新意向(CatalogActivity.this、EditorActivity.class);
Uri currentTaskUri=ContentUris.withAppendedId(Entry.CONTENT\u Uri,id);
intent.setData(currentTaskUri);
星触觉(意向);
}
});
getLoaderManager().initLoader(任务加载器,null,this);
}
私有void deleteAllTasks(){
int rowsDeleted=getContentResolver().delete(Entry.CONTENT_URI,null,null);
Log.v(“CatalogActivity”,rowsDeleted+“从任务数据库中删除的行”);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.menu\u目录,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例R.id.action\u insert\u dummy\u数据:
insertTask();
返回true;
案例R.id.action\u删除\u所有\u条目:
deleteAllTasks();
返回true;
}
返回super.onOptionsItemSelected(项目);
}
@凌驾
公共加载器onCreateLoader(inti,Bundle){
字符串[]投影={
条目。\u ID,
Entry.COLUMN\u任务\u名称,
String.valueOf(Entry.COLUMN_TASK_COMPLETED)};
返回新的游标装入器(此,//父活动上下文
Entry.CONTENT\u URI,//要查询的提供程序内容URI
投影,//要包含在结果游标中的列
null,//无选择子句
null,//没有选择参数
null);//默认排序顺序
}
@凌驾
public void onLoadFinished(加载器、光标数据){
mCursorAdapter.swapCursor(数据);
}
@凌驾
公共void onLoaderReset(加载器){
mCursorAdapter.swapCursor(空);
}
}
此外,我认为,我找到了解决方案。如果我错了,请纠正我:在String[]投影中,除了ID之外,我只有名称,如果它已完成。我猜这里也需要提醒日期
编辑:是的,解决了我自己的问题。我把提醒数据放在字符串[]投影中,现在它可以工作了。没有你们我就做不到(你们给我指出了正确的方向),非常感谢你。你是最棒的!列索引是基于零的。有3列的游标在索引0、1和2处有值。这可以解释问题标题中列出的异常情况
您发布的代码似乎不是生成该异常的代码。您可以使用
getColumnIndex()获取列索引
对于不在游标中的列返回-1。它从不返回不在游标中的索引。列索引是基于零的。具有3列的游标在索引0、1和2处具有值。这可以解释问题标题中列出的异常
您发布的代码似乎不是生成该异常的代码。您可以使用
getColumnIndex()获取列索引
对于不在游标中的列返回-1。它从不返回不在游标中的索引。设置适配器和传递游标的Post代码。设置适配器和传递游标的Post代码。