为什么我的sqlite数据库中的_id列是空的?

为什么我的sqlite数据库中的_id列是空的?,sqlite,Sqlite,我正在做我的第一个android项目。它目前的用途是在数据库中存储按下按钮的时间。然后,使用基于LoaderManager/CursorLoader/Custom SimpleCursorsAdapter/ContentProvider/ListView的活动显示数据库的完整内容 问题是:当我插入新行时,数据库没有在_id列中存储任何数字。它只是空白: 我试图找到这个问题的答案,但无济于事,我试图深入调试编写数据库代码,但无济于事 按下按钮时执行的代码为: // Function to rec

我正在做我的第一个android项目。它目前的用途是在数据库中存储按下按钮的时间。然后,使用基于LoaderManager/CursorLoader/Custom SimpleCursorsAdapter/ContentProvider/ListView的活动显示数据库的完整内容

问题是:当我插入新行时,数据库没有在_id列中存储任何数字。它只是空白:

我试图找到这个问题的答案,但无济于事,我试图深入调试编写数据库代码,但无济于事

按下按钮时执行的代码为:

// Function to record an awake time
public void onAwake(View view) {
    DateTime now = new DateTime();
    DateTime startOfCurrentDay = now.withTimeAtStartOfDay();
    DateTime noonOfCurrentDay = startOfCurrentDay.plusHours(12);

    TimeEntry timeEntry = new TimeEntry(noonOfCurrentDay.getMillis(), now.getMillis(), TimeEntry.TimeEntryType.TIME_RECORD, TimeEntry.Direction.WAKE);

    TimeEntryDbHandler timeEntryDbHandler = new TimeEntryDbHandler(this);
    long id = timeEntryDbHandler.addTimeEntry(timeEntry);

    // Notify user of execution
    Toast.makeText(this, R.string.toast_awake + " ID:" + String.valueOf(id), Toast.LENGTH_SHORT).show();

}
执行此操作时,toast中显示的ID将如您所期望的那样递增(当前为32或更多)

数据库处理程序代码如下所示:

public class TimeEntryDbHandler extends SQLiteOpenHelper implements BaseColumns {
// If you change the database schema, you must increment the database version.
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "FeedReader.db";
public static final String TABLE_TIME_ENTRIES = "time_entries";

//public static final String _ID = "_id"; // now in basecolumns
public static final String COLUMN_CENTER_OF_DAY = "center_of_day";
public static final String COLUMN_TIME = "time";
public static final String COLUMN_TIME_ENTRY_TYPE = "time_entry_type";
public static final String COLUMN_WAKEUP_OR_BEDTIME = "wakeup_or_bedtime";

public TimeEntryDbHandler(Context context) {
    super (context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_TIME_ENTRIES_TABLE = "CREATE TABLE " + TABLE_TIME_ENTRIES + "("
            + _ID + " INTEGER PRIMARY KEY,"
            + COLUMN_CENTER_OF_DAY + " INTEGER,"
            + COLUMN_TIME + " INTEGER,"
            + COLUMN_TIME_ENTRY_TYPE + " TEXT,"
            + COLUMN_WAKEUP_OR_BEDTIME + " TEXT"
            + ")";
    db.execSQL(CREATE_TIME_ENTRIES_TABLE);
}

// Method to add new time entry row to time entries table
public long addTimeEntry(TimeEntry timeEntry) {
    ContentValues values = new ContentValues();
    values.put(COLUMN_CENTER_OF_DAY, timeEntry.get_centerOfDay());
    values.put(COLUMN_TIME, timeEntry.get_time());
    values.put(COLUMN_TIME_ENTRY_TYPE, timeEntry.get_timeEntryType().name());
    values.put(COLUMN_WAKEUP_OR_BEDTIME, timeEntry.get_direction().name());

    SQLiteDatabase db = this.getWritableDatabase();

    long newRowId;
    newRowId = db.insert(TABLE_TIME_ENTRIES, null, values);
    db.close();

    return newRowId;
}
有人知道为什么数据库不只是在_id列中写入递增的整数吗?否则,您建议我如何调试它

我还在oncreatesql命令中尝试了“AUTO INCREMENT”指令,但这并没有改变任何事情

如果需要发布项目代码的其他区域,请让我知道它是什么,我会发布它


非常感谢

您确定该列实际上是空的吗?您是否尝试执行select查询以查看它是否返回值


SQLite为每个表创建一个名为
rowid
的特殊列。如果声明的字段类型为
整型主键
,则此字段将自动成为
rowid
的别名。因此,您要检查的是
rowid
列的值。

您确定该列实际上是空的吗?您是否尝试执行select查询以查看它是否返回值


SQLite为每个表创建一个名为
rowid
的特殊列。如果声明的字段类型为
整型主键
,则此字段将自动成为
rowid
的别名。因此,您要检查的是
rowid
列的值。

虽然这个问题显示了在这个问题上做了很好的研究,但它缺乏关于它所属SE站点的研究:)我已将其标记为要迁移到。整数主键列不能为空。您是否曾经更改过onCreate函数?嗯,我不确定,但有可能我确实在某个时候更改了onCreate函数。这会对事情产生什么影响?好吧,我让应用程序放下表格,重新从fresh创建它。现在_id列有递增的数字。我猜我在过去对onCreate做了一些更改,忘记升级或删除表,这不知怎么地破坏了它。Cheers@CL:整数主键可以为空,默认值由SQLite自动确定。它与AUTOINCREMENT类似,只是它不是单调的(新条目可能会重用已删除条目的值)。虽然此问题显示了对该问题的良好研究,但它缺乏关于它所属SE站点的研究:)我已将其标记为迁移到。整数主键列不能为空。您是否曾经更改过onCreate函数?嗯,我不确定,但有可能我确实在某个时候更改了onCreate函数。这会对事情产生什么影响?好吧,我让应用程序放下表格,重新从fresh创建它。现在_id列有递增的数字。我猜我在过去对onCreate做了一些更改,忘记升级或删除表,这不知怎么地破坏了它。Cheers@CL:整数主键可以为空,默认值由SQLite自动确定。它与AUTOINCREMENT类似,只是它不是单调的(新条目可能会重用已删除条目的值)。已使用“sqlitebrowser”打开数据库,如上图所示,这些都是其中的列。是的,它肯定是空的,因为报告页面查询它并显示相同的内容。所有android studio文档/教程都说该列名为“\u id”,尽管…
\u id
是整数主键结果集中使用的标准android列名。例如,CursorAdapter将查找具有此名称的列以映射getItemId()。大多数情况下,
\u id
只是SQLite内部
rowid
列的别名。查看SQLite文档了解更多信息:数据库已使用“sqlitebrowser”打开,如上图所示,这些都是其中的列。是的,它肯定是空的,因为报告页面查询它并显示相同的内容。所有android studio文档/教程都说该列名为“\u id”,尽管…
\u id
是整数主键结果集中使用的标准android列名。例如,CursorAdapter将查找具有此名称的列以映射getItemId()。大多数情况下,
\u id
只是SQLite内部
rowid
列的别名。有关更多信息,请查看SQLite文档: