【问题标题】:What is the error in this cursor created for database?为数据库创建的这个游标有什么错误?
【发布时间】:2019-03-15 12:21:40
【问题描述】:

我正在 android 中创建一个 SQLite 数据库。但是每当我调用方法“displayDatabase()”时就会出现一些错误。

请帮忙!!

这里是 displayDatabase() 方法:

public void displayDatabase() {

    DataDbHelper mDbHelper = new DataDbHelper(this);

    SQLiteDatabase db = mDbHelper.getReadableDatabase();

    String[] projection = {DataContract.DataEntry.COLUMN_PROJECT_NAME,
            DataContract.DataEntry.COLUMN_HEAD,
            DataContract.DataEntry.COLUMN_CITY,
            DataContract.DataEntry.COLUMN_COST};
    Cursor c = db.query(DataContract.DataEntry.TABLE_NAME,
            projection,
            null,
            null,
            null,
            null,
            null);
    TextView textView = (TextView) findViewById(R.id.textview);

    try {
        //textView.setText("The database contains - " + c.getColumnCount() + "Columns containing data");

        textView.setText("Hello Welcome\n");

        textView.append("-" + DataContract.DataEntry._ID
                + "---" + DataContract.DataEntry.COLUMN_PROJECT_NAME
                + "---" + DataContract.DataEntry.COLUMN_HEAD
                + "---" + DataContract.DataEntry.COLUMN_CITY
                + "---" + DataContract.DataEntry.COLUMN_COST + "\n");


        int currentId = c.getColumnIndex(DataContract.DataEntry._ID);
        int projectNameId = c.getColumnIndex(DataContract.DataEntry.COLUMN_PROJECT_NAME);
        int headId = c.getColumnIndex(DataContract.DataEntry.COLUMN_HEAD);
        int cityId = c.getColumnIndex(DataContract.DataEntry.COLUMN_CITY);
        int costId = c.getColumnIndex(DataContract.DataEntry.COLUMN_COST);


        while (c.moveToNext()) {
            int id = c.getInt(currentId);
            String projectName = c.getString(projectNameId);
            String head = c.getString(headId);
            String city = c.getString(cityId);
            String cost = c.getString(costId);

            textView.append("-" + id
                    + "---" + projectName
                    + "---" + head
                    + "---" + city
                    + "---" + cost);


        }


    } finally {
        c.close();
    }
}

这是出现在 logcat 中的错误:

CursorWindow:无法从 CursorWindow 读取第 0 行第 -1 列 它有 11 行,4 列。 03-15 10:00:58.359 6348-6348/? E/AndroidRuntime: 致命异常: main 进程:com.example.student.sampledatabase,PID:6348 java.lang.IllegalStateException:无法读取第 0 行,列 -1 光标窗口。确保光标在之前正确初始化 从中访问数据。

【问题讨论】:

  • 您正在尝试获取未包含在 Select 语句中的列索引
  • 另外,作为直接使用 SQLite 的更好替代方案,请尝试使用 Google 的 Room Persistence Library(2017 年推出)。阅读此处:developer.android.com/topic/libraries/architecture/room 并观看此内容以获得快速想法:youtube.com/watch?v=SKWh4ckvFPM Room 通过为您自动生成它来减少所有 SQLite 样板代码和任何可能的错误。您可以直接将您的数据对象类与数据库进行映射。

标签: android sqlite android-sqlite android-database


【解决方案1】:

将此列DataContract.DataEntry._ID 添加到您的投影中。

【讨论】:

    【解决方案2】:

    错误原因

    失败的原因是尝试获取偏移量 -1 处的列,因为偏移量可以从 0 到游标中的列数减去 1,因此该列永远不会存在。

    之所以使用 -1 是因为那是从 当传递给该方法的列名在游标中不存在时,游标getColumnIndex方法。

    你得到 -1 的原因是你没有在光标中包含根据 DataContract.DataEntry._ID 解析的名称列,因此行:-

    int currentId = c.getColumnIndex(DataContract.DataEntry._ID);
    

    导致 currentId 为 -1

    因此执行以下行时出现上述错误:-

    int id = c.getInt(currentId);
    

    修复

    一种解决方法是指定 null 而不是 projection,这将导致检索表的所有列并且相当于使用 SELECT * FROM .......

    例如通过使用:-

    Cursor c = db.query(DataContract.DataEntry.TABLE_NAME,
            null,
            null,
            null,
            null,
            null,
            null);
    

    另一个解决办法是改变:-

    String[] projection = {DataContract.DataEntry.COLUMN_PROJECT_NAME,
            DataContract.DataEntry.COLUMN_HEAD,
            DataContract.DataEntry.COLUMN_CITY,
            DataContract.DataEntry.COLUMN_COST};
    

    改为:-

    String[] projection = {DataContract.DataEntry._ID,
            DataContract.DataEntry.COLUMN_PROJECT_NAME,
            DataContract.DataEntry.COLUMN_HEAD,
            DataContract.DataEntry.COLUMN_CITY,
            DataContract.DataEntry.COLUMN_COST};
    

    因此,该列将包含在光标中,并且偏移量将是该列的偏移量(在上述情况下为 0,因为它是结果中的第一列)。

    【讨论】:

      猜你喜欢
      • 2015-06-11
      • 2011-09-13
      • 2019-08-12
      • 2013-02-05
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多