我正在制作我的第一个android项目。其目的是在数据库中按下按钮时存储时间。然后使用基于LoaderManager / CursorLoader / Custom SimpleCursorAdapter / 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列?否则,你建议我做什么调试呢?
我也试过了“自动收益”。在onCreate SQL命令中的指令,但没有改变任何东西。
如果需要发布项目代码的其他区域,请告诉我它是什么,我会发布它。
非常感谢!
答案 0 :(得分:0)
您确定该列实际上是空的吗?您是否尝试执行选择查询以查看它是否返回值?
SQLite为每个表创建一个名为rowid
的特殊列。如果您声明类型为INTEGER PRIMARY KEY
的字段,则此字段会自动成为rowid
的别名。因此,您要检查的是rowid
列的值。