2016-04-20 59 views
0

我试图使用SQLite数据库在我的应用程序中存储一些待办事项数据。当我尝试输入一些数据时就失败了。我搜索了StackOverflow,更改数据库或表名称似乎不适用于我的情况。 在logcat中的错误是Android SQLite数据库数据类型不匹配

放弃语句以5:[(?,?,?,)INSERT INTO托多斯(完整,说明,标题,投标截止时间)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类(我没有把最后一个字段在我的数据库,是OK?):

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 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类中添加/更改你的代码的更改:请卸载并重新安装应用程序。

+0

我将这些行添加到清单文件,并解决了旧问题!但是应用程序在安装时崩溃,表示类似'无法启动活动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