Android SQLite 数据库数据类型不匹配

Android SQLite DB datatype mismatch

我试图使用 SQLite 数据库在我的应用程序中存储一些待办事项数据。当我试图输入一些数据时它失败了。我搜索了 Whosebug,更改数据库或 table 名称似乎不适合我的情况。 logcat 中的错误是

statement aborts at 5: [INSERT INTO Todos(Complete,Description,Title,Deadline) VALUES (?,?,?,?)] datatype mismatch

我的 SQLHelper class:

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 class(我没有把最后一个字段放入我的数据库,可以吗?):

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);
        }
    });

万分感谢,如果你能给我一些关于这方面的想法!

如果要自动重新创建方案,请增加 DATABASE_VERSION

private static final int DATABASE_VERSION = 2;

如果不这样做,则必须卸载应用程序才能重新创建方案。

我已经执行了你的代码,它基本上工作正常,getwritable db 在你的应用程序中不起作用

所以我对你的代码做了一些修改,见下文

添加这些代码 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 class 中添加/修改您的代码时:请卸载并重新安装应用程序。

好的,我认为您的 onCreate() 方法有误。尝试使用 next 代替:

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 - 是必填参数。