我在 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());
总结
使用 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());