Я пытался использовать базу данных 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);
}
});
Спасибо миллион, если вы могли бы дать мне некоторое представление об этом!
Пожалуйста, не используйте все шапки для любых переменных, которые не являются константами. Это соглашение Java-кода. В любом случае вам может понадобиться удалить приложение, чтобы заставить смену схемы работать –
извините, что я новичок. Я буду обращать на это внимание в будущем :) – Emile
Я думаю использовать varchar (200) вместо текста при создании базы данных. – sushildlh