2016-04-20 13 views
0

SQLiteデータベースを使用して、自分のアプリにデータを格納しようとしました。私はいくつかのデータを入れようとしたときに失敗しました。私はStackOverflowを検索して、データベースやテーブル名を変更しても私の場合はうまくいかないようです。 logcatで エラーがAndroidのSQLite DBのデータ型の不一致

文は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

、それはこれらのコードに DatabaseHelper.classを追加ウルアプリケーションで

を働いていないデシベルgetwritableはので、私はウルのコード内のいくつかの変更が

下記参照作られていることを基本的に正常に動作します:

:マニフェストファイルの

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クラスのurコードの変更を追加/変更する場合は、アプリをアンインストールしてから再インストールしてください。

+0

私はこれらの行をマニフェストファイルに追加し、古い問題を解決しました!しかし、アプリケーションがインストール時にクラッシュし、「ComponentInfo {MainActivity}アクティビティを開始できませんでした:android.view.InflateException:バイナリXMLファイル行#4:クラスフラグメントを拡張するエラー」のようなものがありました。私は後でこれをチェックする必要があるかもしれません。とにかく助けてくれてありがとう! – Emile

-1

自動的スキームを再作成する場合は、あなたがスキームを再作成するアプリをアンインストールする必要はありません場合は、DATABASE_VERSIONに

private static final int DATABASE_VERSION = 2; 

を高めます。私はウルのコードをexectedいる

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

整数プライマリキーは常に必要ですか?私はそれを知らなかった。 – Emile