我在 sqlite 中的第一次插入会发生什么?

what happens to my first insertion in sqlite?

总结

使用 android studio 和 sqlite 数据库,我试图将一些行插入 table。问题是当我想阅读它们时,它会忽略第一行。

代码

首先插入 3 行到 DATASETS_INFO table:

        SQLiteDatabase db = this.getWritableDatabase();

        String query = "INSERT INTO `DATASETS_INFO`(`dataset_ID`, `dataset_name`, `type`, `RAPI`) " +
                "VALUES (122, 'avg temp salon 2', 1, '3avwVmZpw00')";
        db.execSQL(query);

        query = "INSERT INTO `DATASETS_INFO`(`dataset_ID`, `dataset_name`, `type`, `RAPI`) " +
                "VALUES (125, 'avg hum salon 2', 2, '75uNfLLy300')";
        db.execSQL(query);

        query = "INSERT INTO `DATASETS_INFO`(`dataset_ID`, `dataset_name`, `type`, `RAPI`) " +
                "VALUES (126, 'max hum salon 2', 2, 'b8rwdUM4F00')";
        db.execSQL(query);

然后阅读它们:

        SQLiteDatabase db = this.getWritableDatabase();
        String query = "Select dataset_name, type FROM DATASETS_INFO";
        Cursor myCursor = db.rawQuery(query, null);
        Log.d("DatabaseHelper", "myCursor.getCount(): " + myCursor.getCount());
        DatasetInfo[] datasetInfos = new DatasetInfo[myCursor.getCount()];
        if (myCursor.moveToFirst()) {
            int i=0;
            while (myCursor.moveToNext()) {
                Log.d("DatabaseHelper", "i: " + i + ", dataset_name: " + myCursor.getString(0));
                datasetInfos[i] = new DatasetInfo();
                datasetInfos[i].dataset_name = myCursor.getString(0);
                datasetInfos[i].type = myCursor.getInt(1);
                ++i;
            }
        }

输出: 如您所见,它忽略了第一行并从第二行开始:

07-24 10:38:06.317 7253-7253/com.example.black3rror.mpandroidchart D/DatabaseHelper: myCursor.getCount(): 3
07-24 10:38:06.317 7253-7253/com.example.black3rror.mpandroidchart D/DatabaseHelper: i: 0, dataset_name: avg hum salon 2
07-24 10:38:06.317 7253-7253/com.example.black3rror.mpandroidchart D/DatabaseHelper: i: 1, dataset_name: max hum salon 2

有趣的是 getCount() returns 3 但我不知道第一个在哪里。

第一个记录被跳过的原因是你在调用moveToFirst()然后没有读取它(这是第一个记录),你在调用moveToNext()。因此,在这些调用之间会跳过第一条记录。

moveToFirst() 用于在已经到达某个位置后需要从头开始迭代的情况。就您而言,您已经处于第一位。以下应该有效:

int i = 0;
  do  {
   Log.d("DatabaseHelper", "i: " + i + ", dataset_name: " + myCursor.getString(0));
        datasetInfos[i] = new DatasetInfo();
        datasetInfos[i].dataset_name = myCursor.getString(0);
        datasetInfos[i].type = myCursor.getInt(1);
        ++i;
} while (myCursor.moveToNext());

你应该使用 do while 循环

          do {
            Log.d("DatabaseHelper", "i: " + i + ", dataset_name: " + myCursor.getString(0));
            datasetInfos[i] = new DatasetInfo();
            datasetInfos[i].dataset_name = myCursor.getString(0);
            datasetInfos[i].type = myCursor.getInt(1);
            ++i;
        } while (myCursor.moveToNext());