Я делаю свой первый проект для Android. Его цель в настоящее время заключается в сохранении времени, когда нажата кнопка в базе данных. Полное содержимое базы данных затем отображается с использованием активности LoaderManager/CursorLoader/Custom SimpleCursorAdapter/ContentProvider/ListView.Почему столбец _id в моей базе данных sqlite пуст?
Проблема заключается в следующем: база данных не хранит никаких чисел в столбце _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();
}
Когда это выполняется, идентификатор, который показан в тостах приращение, как можно было бы ожидать (в настоящее время 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, но это ничего не изменило.
Если необходимо разместить другие области кода проекта, сообщите мне, что это такое, и я отправлю его.
Большое спасибо!
Хотя этот вопрос показывает хорошее исследование, проведенное по этому вопросу, ему не хватает исследований относительно сайта SE, к которому он принадлежит :) Я отметил его для перехода на [SO]. – Izzy
Столбец INTEGER PRIMARY KEY * не может быть пустым. Вы когда-либо меняли функцию 'onCreate'? –
Хмм, я не уверен, но возможно, что я изменил функцию onCreate в какой-то момент. Как это может повлиять на вещи? – Meiji