2016-04-20 2 views
0

Я пытался использовать базу данных SQLite для хранения некоторых данных в своем приложении. И это не удалось, когда я попытался вставить некоторые данные. Я искал StackOverflow, изменение имени базы данных или таблицы, похоже, не работало для моего дела. Ошибка в LogCat являетсяAndroid SQLite DB datatype mismatch

заявление прерывается на 5: [(??,,) INSERT INTO Todos (Complete, описание, название, срок) VALUES] Тип данных рассогласования

Мои SQLHelper класс:

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static final int DATABASE_VERSION = 1; 
    // Database name 
    private static final String DATABASE_NAME = "todoManager"; 
    // Todos table name 
    private static final String TABLE_TODOS = "Todos"; 
    // Todos table columns names 
    private static final String KEY_TITLE = "Title"; 
    private static final String KEY_DDL = "Deadline"; 
    private static final String KEY_DES = "Description"; 
    private static final String KEY_COM = "Complete"; 

    public DatabaseHelper (Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     //String for creating table TODOS. 
     String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_TODOS + " (" 
       + KEY_TITLE + " TEXT, " 
       + KEY_DDL + " TEXT, " 
       + KEY_DES + " TEXT, " 
       + KEY_COM + " TEXT)"; 
     //Run string 
     db.execSQL(sql); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     //Drop old table, if it existed. 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_TODOS); 
     //Create tables again. 
     onCreate(db); 
    } 

    public void delete(TodoItem item) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_TODOS, KEY_TITLE + " = " + item.getTITLE(), null); 
    } 

    public void addTodo(TodoItem item) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     //Prepare and save all values for insertion. 
     ContentValues values = new ContentValues(); 
     values.put(KEY_TITLE, item.getTITLE()); 
     values.put(KEY_DDL, item.getDEADLINE()); 
     values.put(KEY_DES, item.getDESCRIPTION()); 
     values.put(KEY_COM, item.getCOMPLETED()); 

     db.insert(TABLE_TODOS, null, values); 
     db.close(); 
    } 

    public void updateTodo(TodoItem item) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 

     //Update rows 
     values.put(KEY_TITLE, item.getTITLE()); 
     values.put(KEY_DDL, item.getDEADLINE()); 
     values.put(KEY_DES, item.getDESCRIPTION()); 
     values.put(KEY_COM, item.getCOMPLETED()); 

     db.update(TABLE_TODOS, values, KEY_TITLE + " = ?", new String[]{String.valueOf(item.getTITLE())}); 

    } 

    public ArrayList<TodoItem> getAllTodos() { 
     ArrayList<TodoItem> list = new ArrayList<TodoItem>(); 
     SQLiteDatabase db = this.getWritableDatabase(); 

     //Select all query 
     String query = "SELECT * FROM " + TABLE_TODOS; 
     Cursor cursor = db.rawQuery(query, null); 

     //Add to list 
     if(cursor.moveToFirst()) { 
      do { 
       TodoItem todo = new TodoItem(cursor.getString(0), cursor.getString(1), 
         cursor.getString(2),cursor.getString(3),cursor.getString(4)); 
       todo.setTITLE(cursor.getString(0)); 
       list.add(todo); 
      } while (cursor.moveToNext()); 
     } 
     return list; 
    } 

}

Мой TodoItem класс (я не ставил последнее поле в моей базе данных, нормально ли это?):

public class TodoItem { 
private String TITLE = TodoListProvider.TaskEntry.COL_TITLE; 
private String DESCRIPTION = TodoListProvider.TaskEntry.COL_DESCRIPTION; 
private String DEADLINE = TodoListProvider.TaskEntry.COL_DEADLINE; 
private String COMPLETED = TodoListProvider.TaskEntry.COL_COMPLETED; 
private String TIME_CREATED = TodoListProvider.TaskEntry.COL_TIME_CREATED; 

    public TodoItem(String tt, String dl,String dt,String cm,String tc) { 
     this.TITLE= tt; 
     this.DESCRIPTION = dt; 
     this.DEADLINE = dl; 
     this.COMPLETED = cm; 
     this.TIME_CREATED = tc; 
    } 
public String getTITLE() { 
    return TITLE; 
} 

public void setTITLE(String TITLE) { 
    this.TITLE = TITLE; 
} 

public String getDESCRIPTION() { 
    return DESCRIPTION; 
} 

public void setDESCRIPTION(String DETAILS) { 
    this.DESCRIPTION = DETAILS; 
} 

public String getDEADLINE() { 
    return DEADLINE; 
} 

public void setDEADLINE(String DEADLINE) { 
    this.DEADLINE = DEADLINE; 
} 

public String getCOMPLETED() { 
    return COMPLETED; 
} 

public void setCOMPLETED(String COMPLETED) { 
    this.COMPLETED = COMPLETED; 
} 

public String getTIME_CREATED() { 
    return TIME_CREATED; 
} 

public void setTIME_CREATED(String TIME_CREATED) { 
    this.TIME_CREATED = TIME_CREATED; 
} 

}

Это, как я назвал базу данных в виде фрагмента (с помощью кнопки мыши):

public class EditItemFragment extends Fragment { 
private View view; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.fragment_edit_item, container, false); 
    return view; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
    EditText title = (EditText) view.findViewById(R.id.editTitle); 
    EditText deadline = (EditText) view.findViewById(R.id.editDDL); 
    EditText description = (EditText) view.findViewById(R.id.editDescription); 
    EditText complete = (EditText) view.findViewById(R.id.editComplete); 

    String Title = title.getText().toString(); 
    String Deadline = deadline.getText().toString(); 
    String Description = description.getText().toString(); 
    String Complete = complete.getText().toString(); 

    final TodoItem item = new TodoItem(Title, Deadline, Description, Complete, "now"); 

    Button saveBtn = (Button) getActivity().findViewById(R.id.btnSave); 
    saveBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      DatabaseHelper helper = new DatabaseHelper(getActivity()); 
      helper.addTodo(item); 
     } 
    }); 

Спасибо миллион, если вы могли бы дать мне некоторое представление об этом!

+0

Пожалуйста, не используйте все шапки для любых переменных, которые не являются константами. Это соглашение Java-кода. В любом случае вам может понадобиться удалить приложение, чтобы заставить смену схемы работать –

+0

извините, что я новичок. Я буду обращать на это внимание в будущем :) – Emile

+0

Я думаю использовать varchar (200) вместо текста при создании базы данных. – sushildlh

ответ

0

Я exected ур кода, он отлично работает в основном, что getwritable дб не работает в урах приложений

так что я сделал некоторые изменения в урах коды см ниже

Добавить эти коды DatabaseHelper.class:

private static DatabaseHelper instance; 
    public static synchronized DatabaseHelper getHelper(Context context) { 
     if (instance == null) 
      instance = new DatabaseHelper(context); 
     return instance; 
    } 


****`Add these In Ur Fragment Activity:`**** 


//Declare in private 
    DatabaseHelper helper; 
    SQLiteDatabase database; 

    //In on createView: 

     if (helper == null) { 
     helper = DatabaseHelper.getHelper(getActivity()); 
     database = helper.getWritableDatabase(); 
    } 

права доступа к файлу манифеста:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Примечание: Всякий раз, когда ур добавляет/изменяет изменения в коде ур в классе dbhelper: удалите и переустановите приложение.

+0

Я добавил эти строки в файл манифеста и старая проблема решена! Но приложение разбилось на установку, сказало что-то вроде «Не удалось запустить Activity ComponentInfo {MainActivity}: android.view.InflateException: двоичная строка XML-файла # 4: ошибка раздувания фрагмента класса. Возможно, мне придется проверить это позже. В любом случае спасибо за вашу помощь! – Emile

-1

Если вы хотите, чтобы автоматически создать схему, увеличивайте DATABASE_VERSION

private static final int DATABASE_VERSION = 2; 

Если вы не должны удалить приложение, чтобы воссоздать схему.

0

Хорошо, я думаю, что у вас неправильный метод onCreate(). Вместо этого используйте следующее:

private static final String KEY_ID = "_id"; 

@Override 
    public void onCreate(SQLiteDatabase db) { 
     //String for creating table TODOS. 
     String sql = "CREATE TABLE " + TABLE_TODOS + " (" 
       + KEY_ID + " INTEGER PRIMARY KEY," + 
       + KEY_TITLE + " TEXT," 
       + KEY_DDL + " TEXT," 
       + KEY_DES + " TEXT," 
       + KEY_COM + " TEXT)"; 
     //Run string 
     db.execSQL(sql); 
    } 

KEY_ID - обязательный параметр.

+0

Целочисленный первичный ключ всегда необходим? OMG, я этого не знал. – Emile

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