2015-07-19 2 views
1

Я делаю свой первый проект для Android. Его цель в настоящее время заключается в сохранении времени, когда нажата кнопка в базе данных. Полное содержимое базы данных затем отображается с использованием активности LoaderManager/CursorLoader/Custom SimpleCursorAdapter/ContentProvider/ListView.Почему столбец _id в моей базе данных sqlite пуст?

Проблема заключается в следующем: база данных не хранит никаких чисел в столбце _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(); 

} 

Когда это выполняется, идентификатор, который показан в тостах приращение, как можно было бы ожидать (в настоящее время 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? В противном случае, что вы предлагаете мне сделать, чтобы отладить это?

Я также попробовал директиву «AUTO INCREMENT» в команде onCreate SQL, но это ничего не изменило.

Если необходимо разместить другие области кода проекта, сообщите мне, что это такое, и я отправлю его.

Большое спасибо!

+0

Хотя этот вопрос показывает хорошее исследование, проведенное по этому вопросу, ему не хватает исследований относительно сайта SE, к которому он принадлежит :) Я отметил его для перехода на [SO]. – Izzy

+0

Столбец INTEGER PRIMARY KEY * не может быть пустым. Вы когда-либо меняли функцию 'onCreate'? –

+0

Хмм, я не уверен, но возможно, что я изменил функцию onCreate в какой-то момент. Как это может повлиять на вещи? – Meiji

ответ

0

Вы уверены, что столбец на самом деле пуст? Вы пытались выполнить запрос select, чтобы узнать, возвращает ли оно значение?

SQLite создает специальный столбец под названием rowid для каждой таблицы. Если вы объявите поле типа INTEGER PRIMARY KEY, это поле автоматически станет псевдонимом для rowid. Итак, вы хотите проверить значение столбца rowid.

+0

База данных была открыта с помощью 'sqlitebrowser ', как на рисунке выше, это все столбцы в нем. Да, он определенно пуст, потому что страница отчета запрашивает его и показывает то же самое. Все андроидные студийные документы/учебники говорят, что столбец называется «_id», хотя ... – Meiji

+0

'_id' - стандартное имя столбца Android, используемое в результирующем наборе для целочисленного первичного ключа.Например, CursorAdapter ищет столбец с этим именем для отображения getItemId(). В большинстве случаев '_id' является просто псевдонимом для внутреннего' rowid'column SQLite. Для получения дополнительной информации обратитесь к документации SQLite: https://www.sqlite.org/lang_createtable.html#rowid – BladeCoder