Android sqlite:插入值时出错:SQLite约束异常

时间:2012-03-19 10:41:36

标签: android sql

创建数据库后,当我尝试插入值时,我发现Exception如下..

android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

我不知道为什么会这样。 有人请帮帮我.. 提前完成了... 主类和助手类在下面给出..

public class Database extends Activity{

    public static final String MYDATABASE_NAMEEE = "MY_DATABASE_RESTAURANT";
    public static final int MYDATABASE_VERSION = 4;
    public static final String MYDATABASE_TABLE = "Restaurant";
    public static final String KEY_ID = "_id";
    public static final String KEY_CONTENT1 = "Restaurant_name";
    public static final String KEY_CONTENT2 = "Ac_or_nonac";
    public static final String KEY_CONTENT3 = "Total_chairs";
    public static final String KEY_CONTENT4 = "Reserved_chairs";
    public static final String KEY_CONTENT5 = "Date";
    public static final String KEY_CONTENT6 = "fromTime"; 
    public static final String KEY_CONTENT7 = "toTime"; 
    public static final String KEY_CONTENT8 = "Name";
    public static final String KEY_CONTENT9 = "Contact_Number";
    public static final String KEY_CONTENT10 = "Table_id";

    private Helper helper;
    private SQLiteDatabase database;

    Button button_submit;
    ListView listView;
    EditText editText_name,editText_number,editText_seats,editText_date,editText_fromtime,editText_totime;
    SimpleCursorAdapter cursorAdapter;
    Cursor cursor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.databaselist);

        listView = (ListView) findViewById(R.id.listView1);
        button_submit = (Button) findViewById(R.id.button_submit);
        editText_date = (EditText) findViewById(R.id.editText_date);
        editText_fromtime = (EditText) findViewById(R.id.editText_fromtime);
        editText_name = (EditText) findViewById(R.id.editText_name);
        editText_number = (EditText) findViewById(R.id.editText_contactnumber);
        editText_seats = (EditText) findViewById(R.id.editText_seatsneeded);
        editText_totime = (EditText) findViewById(R.id.editText_totime);


        helper = new Helper(this, MYDATABASE_NAMEEE, null, MYDATABASE_VERSION);
        database = helper.getWritableDatabase();

        cursor = database.query(MYDATABASE_TABLE, null,null, null, null, null, null);
        String[] from=new String[]{KEY_ID,KEY_CONTENT3,KEY_CONTENT4,KEY_CONTENT5
                ,KEY_CONTENT6,KEY_CONTENT7,KEY_CONTENT8,KEY_CONTENT9,KEY_CONTENT10};
        int[] to=new int[]{R.id.textView_id,R.id.textView_totalno_ofseats,R.id.textView_no_ofseatsreserved,R.id.textView_date
            ,R.id.textView_timefrom,R.id.textView_totime,R.id.textView_name,R.id.textView_contactnumber,R.id.textView_tableid};
        cursorAdapter=new  SimpleCursorAdapter(getApplicationContext(), R.layout.databasetext, cursor, from, to);
        listView.setAdapter(cursorAdapter);


        button_submit.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
            String date = editText_date.getText().toString();
            String fromtime = editText_fromtime.getText().toString();
            String name = editText_name.getText().toString();
            String number = editText_number.getText().toString();
            String seats = editText_seats.getText().toString();
            String totime = editText_totime.getText().toString();

            ContentValues cv1 = new ContentValues();
            cv1.put(KEY_CONTENT5, date);
            cv1.put(KEY_CONTENT6, fromtime);
            cv1.put(KEY_CONTENT8, name);
            cv1.put(KEY_CONTENT9, number);
            cv1.put(KEY_CONTENT4, seats);
            database.insert(MYDATABASE_TABLE, null, cv1);
            //cursor.requery();

            editText_date.setText("");
            editText_fromtime.setText("");
            editText_name.setText("");
            editText_number.setText("");
            editText_seats.setText("");
            editText_totime.setText("");
            filldata();

            }
        });
    }
    private void filldata() {
        // TODO Auto-generated method stub
        Cursor cursor = database.query(MYDATABASE_TABLE, null,
                null, null, null, null,null);

        String[] from=new String[]{KEY_ID,KEY_CONTENT3,KEY_CONTENT4,KEY_CONTENT5
                ,KEY_CONTENT6,KEY_CONTENT7,KEY_CONTENT8,KEY_CONTENT9,KEY_CONTENT10};
        int[] to=new int[]{R.id.textView_id,R.id.textView_totalno_ofseats,R.id.textView_no_ofseatsreserved,R.id.textView_date
            ,R.id.textView_timefrom,R.id.textView_totime,R.id.textView_name,R.id.textView_contactnumber,R.id.textView_tableid};
        cursorAdapter=new  SimpleCursorAdapter(getApplicationContext(), R.layout.databasetext, cursor, from, to);
        listView.setAdapter(cursorAdapter);

    }
}




public class Helper extends SQLiteOpenHelper{

    public static final String MYDATABASE_TABLE = "Restaurant";
    public static final String KEY_ID = "_id";
    public static final String KEY_CONTENT1 = "Restaurant_name";
    public static final String KEY_CONTENT2 = "Ac_or_nonac";
    public static final String KEY_CONTENT3 = "Total_chairs";
    public static final String KEY_CONTENT4 = "Reserved_chairs";
    public static final String KEY_CONTENT5 = "Date";
    public static final String KEY_CONTENT6 = "fromTime"; 
    public static final String KEY_CONTENT7 = "toTime"; 
    public static final String KEY_CONTENT8 = "Name";
    public static final String KEY_CONTENT9 = "Contact_Number";
    public static final String KEY_CONTENT10 = "Table_id";


    private static final String SCRIPT_CREATE_DATABASE =
          "create table " + MYDATABASE_TABLE + " ("
          + KEY_ID + " integer primary key, "
          + KEY_CONTENT1 + " text not null, "
          + KEY_CONTENT2 + " text not null, "
          + KEY_CONTENT3 + " integer not null, "
          + KEY_CONTENT4 + " integer not null, "
          + KEY_CONTENT5 + " text not null, "
          + KEY_CONTENT6 + " text not null, "
          + KEY_CONTENT7 + " text not null, "
          + KEY_CONTENT8 + " text not null, "
          + KEY_CONTENT9 + " text not null, "
          + KEY_CONTENT10 + " text not null) ";


    public Helper(Context context, String name, CursorFactory factory,
            int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(SCRIPT_CREATE_DATABASE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }
}

4 个答案:

答案 0 :(得分:2)

请确保您在有效主键中插入一行,即在表格中将其设为唯一(我认为您之所以这样做是因为您'重新尝试插入已在同一数据库表中定义主键的行。)

答案 1 :(得分:1)

在数据库模式中,您将所有内容声明为NOT NULL,但在插入中,您的每个字段都没有值。 SQLite抛出异常,因为它不知道要在字段中插入什么。删除NOT NULL约束,以便SQlite可以将null值作为默认值插入,或者为每个字段添加一个值。

答案 2 :(得分:1)

更正数据库的定义。因为将字段声明为 not null ..您必须向每个字段发送一些数据..所以从不需要的数据字段中删除不是nul1 < / p>

答案 3 :(得分:0)

确保您没有尝试在那里插入一些不唯一的值。 确保您没有尝试跳过插入中的任何“非空”值。提供非空列的值或定义默认值。

另一方面,您在两个具有相同值的不同类中定义KEY_CONTENT1等。不要重复。您正在为它们使用静态上下文,因此在一个类中定义它们并使用静态上下文在其中检索它们。