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

时间:2015-07-19 17:30:09

标签: sqlite

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

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

我试图找到一个答案无济于事,我试图深入调试写入数据库代码,但无济于事。

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

// 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命令中的指令,但没有改变任何东西。

如果需要发布项目代码的其他区域,请告诉我它是什么,我会发布它。

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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