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