2015-06-14 3 views
0

Я использую API Google Tasks в своем приложении. Одно из полей в моем приложении «дата выполнения» requires a DateTime object. Я использую Android datepicker dailog и вид EditText, чтобы зафиксировать дату выполнения, а затем преобразовать вход пользователя в формат даты и времени. Когда я пытаюсь записать в мою базу данных SQLite, я получаю следующее исключение.Android не может писать datetime в базу данных sqllite

Error inserting due=2015-06-14T15:58:38.572-04:00 title=Test app _id=TaskId0.07429873487580996 status=needsAction notes=Test write 
    android.database.sqlite.SQLiteException: table tasks has no column named due (code 1): , while compiling: INSERT INTO tasks(due,title,_id,status,notes) VALUES (?,?,?,?,?) 

, что сбивает с толку, потому что я определяю столбец с именем «due». Далее в журналах есть еще одно исключение.

06-14 15:58:38.607 15395-15395/com.github.idclark.forgetmenot E/EDITFRAGMENT﹕ null 
    java.text.ParseException: Unparseable date: "06/14/15" (at offset 8) 
      at java.text.DateFormat.parse(DateFormat.java:579) 
      at com.github.idclark.forgetmenot.EditFragment.getTaskDueDate(EditFragment.java:64) 

схеме определяется как

public static final class TaskEntry implements BaseColumns { 

     public static final String TABLE_NAME = "tasks"; 
     public static final String COLUMN_TASK_ID = "_id"; 
     public static final String COLUMN_TASK_TITLE = "title"; 
     public static final String COLUMN_TASK_UPDATED = "updated"; 
     public static final String COLUMN_TASK_SELFLINK = "selfLink"; 
     public static final String COLUMN_TASK_PARENT = "parent"; 
     public static final String COLUMN_TASK_POSITION = "position"; 
     public static final String COLUMN_TASK_NOTES = "notes"; 
     public static final String COLUMN_TASK_STATUS = "status"; 
     public static final String COLUMN_TASK_DUE = "due"; 
     public static final String COLUMN_TASK_COMPLETED = "completed"; 
     public static final String COLUMN_TASK_DELETED = "deleted"; 
     public static final String COLUMN_TASK_HIDDEN = "hidden"; 

так колонна "из-за" не существует. И таблица создается

@Override 
    public void onCreate(SQLiteDatabase db) { 

     //status must be either needsAction or completed 

     final String CREATE_TASK_TABLE = 
       "CREATE TABLE " + TaskEntry.TABLE_NAME + " (" + 
         TaskEntry._ID + " INTEGER PRIMARY KEY," + 
         TaskEntry.COLUMN_TASK_ID + "TEXT NOT NULL, " + 
         TaskEntry.COLUMN_TASK_TITLE + "TEXT NOT NULL, " + 
         TaskEntry.COLUMN_TASK_COMPLETED + "TEXT, " + 
         TaskEntry.COLUMN_TASK_NOTES + "TEXT, " + 
         TaskEntry.COLUMN_TASK_STATUS + "TEXT NOT NULL, " + 
         TaskEntry.COLUMN_TASK_DUE + "DATETIME, " + 
         TaskEntry.COLUMN_TASK_UPDATED + "DATETIME, " + 
         TaskEntry.COLUMN_TASK_PARENT + "TEXT, " + 
         TaskEntry.COLUMN_TASK_DELETED + "BOOLEAN, " + 
         TaskEntry.COLUMN_TASK_SELFLINK + "TEXT, " + 
         TaskEntry.COLUMN_TASK_POSITION + "TEXT, " + 
         TaskEntry.COLUMN_TASK_HIDDEN + "TEXT" + ")"; 

     db.execSQL(CREATE_TASK_TABLE); 
    } 

В этом методе происходит преобразование даты.

public DateTime getTaskDueDate() { 
    mDueDate = (EditText) getActivity().findViewById(R.id.task_due_date); 
    return new DateTime(mDueDate.getText().toString()); 
} 

Данные затем, наконец, записываются в базу данных с

public boolean insertRow(Task task) { 
     ContentValues values = new ContentValues(); 
     values.put(TaskContract.TaskEntry.COLUMN_TASK_STATUS, task.getStatus()); 
     values.put(TaskContract.TaskEntry.COLUMN_TASK_ID,task.getId()); 
     values.put(TaskContract.TaskEntry.COLUMN_TASK_TITLE,task.getTitle()); 
     values.put(TaskContract.TaskEntry.COLUMN_TASK_DUE, task.getDue().toString()); 
     values.put(TaskContract.TaskEntry.COLUMN_TASK_NOTES, task.getNotes()); 

     SQLiteDatabase db = this.getWritableDatabase(); 
     boolean createSuccessful = db.insert(TaskContract.TaskEntry.TABLE_NAME, null, values) > 0; 
     db.close(); 
     return createSuccessful; 
    } 

Я запутался, почему не удается это писать, и SQL утверждает, что нет «из-за» колонки. Несмотря на то, что есть исключение синтаксического разбора, я вижу также метку времени в журналах. Является частью проблемы, которую я вызываю .toString() в объекте datetime, прежде чем записывать его в db? У меня нет большого опыта работы с sql и я действительно смущен, что делать с этими исключениями.

+0

Вы попали куда-нибудь с этим? Я также думал, что вызов toString() был проблемой. – burntsugar

+0

@burntsugar все еще не застрял, хотя я уверен, что это комбинация синтаксического анализа даты + добавление записи datetime в объект ContentValues ​​ – idclark

+0

hrmmm, sqlite не имеет типа datetime http://www.sqlite.org/ datatype3.html. мне нужно будет преобразовать эту метку времени в текст – idclark

ответ

3

Для проблемы с sqlite вам необходимо иметь пробелы между именами столбцов и типами. Например, изменить

TaskEntry.COLUMN_TASK_DUE + "DATETIME, " + 

в

TaskEntry.COLUMN_TASK_DUE + " DATETIME, " + 

Там Похожая проблема с почти всеми столбцами.

После установки CREATE TABLE SQL удалите и переустановите приложение, чтобы воссоздать базу данных.

Для решения проблемы синтаксического анализа даты используйте формат даты, соответствующий вашим данным. Если вам нужна подробная помощь, отправьте новый вопрос.

+0

хорошо, что было неловко просто исправить – idclark

Смежные вопросы