【问题标题】:The primary key not work主键不起作用
【发布时间】:2014-08-11 14:07:07
【问题描述】:

我是安卓新手。我创建了一个这样的表:

public class DBHelper extends SQLiteOpenHelper {

    public String DBPath;
    public static String DBName = "FAEXPED";
    public static final int version = 1;    
    public static String tableName = "LesOrdres";

    public static final String KEY_CodeClient = "CodeClient";
    public static final String KEY_CodeDest = "CodeDestinataire";
    public static final String KEY_NoOrdre = "NoOrdre";
    public static final String KEY_Ordre_1 = "Ordre_1"; 
    public static final String KEY_Ordre_2 = "Ordre_2"; 
    public static final String KEY_DateOrdre = "DateOrdre";
    public static final String KEY_GPSOrdre = "GPSOrdre";       

    private static final String TAG = "Create_The_DB";

    private static final String TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " +
            tableName + "( "+ KEY_CodeClient + " VARCHAR, "+ KEY_CodeDest +"  VARCHAR," + KEY_NoOrdre +"  VARCHAR,"+ KEY_Ordre_1 +"  VARCHAR,"+ KEY_Ordre_2 +"  VARCHAR, "
                            + KEY_DateOrdre + " DATE, "+ KEY_GPSOrdre +"  VARCHAR,"     
             + " PRIMARY KEY("+KEY_CodeClient+","+ KEY_NoOrdre+","+KEY_Ordre_1+","+KEY_DateOrdre+","+KEY_GPSOrdre+"))";

    public DBHelper(Context context) {
        //super(context, name, factory, version);
        // TODO Auto-generated constructor stub

        super(context, DBName, null, version);      
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
      // TODO Auto-generated method stub
      Log.w(TAG, TABLE_CREATE);   
      db.execSQL(TABLE_CREATE);   
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
         Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                 + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + tableName);
        onCreate(db);

    }
}

还有我的 SQLControll:

public long createItmes(Pers_Ordre ItmOrdre) {

      ContentValues initialValues = new ContentValues();
      initialValues.put(DBHelper.KEY_CodeClient, ItmOrdre.getLe_CodeClient());
      initialValues.put(DBHelper.KEY_CodeDest, ItmOrdre.getLe_CodeDest());
      initialValues.put(DBHelper.KEY_NoOrdre, ItmOrdre.getLe_NoOrdre());
      initialValues.put(DBHelper.KEY_Ordre_1, ItmOrdre.getLe_Ordre_1());
      initialValues.put(DBHelper.KEY_Ordre_2, ItmOrdre.getLe_Ordre_2());
      initialValues.put(DBHelper.KEY_DateOrdre, ItmOrdre.getLe_Date());
      initialValues.put(DBHelper.KEY_GPSOrdre, ItmOrdre.getLe_GPS());

      return database.insert(DBHelper.tableName, null, initialValues);
     }

和通过扫描插入数据的主要活动:

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        //retrieve scan result
        IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);

        if (scanningResult != null) {
            //we have a result
            String scanContent = scanningResult.getContents();
            if (scanContent != null)
            {
                String[] TempOrdre = scanContent.split("_");

                dbcon.open();
                Pers_Ordre oOrdre = new Pers_Ordre();
                oOrdre.setLe_CodeClient(TempOrdre[0]);
                oOrdre.setLe_CodeDest(TempOrdre[1]);
                oOrdre.setLe_NoOrdre(TempOrdre[2]);
                oOrdre.setLe_Ordre_1(TempOrdre[3]);
                oOrdre.setLe_Ordre_2(TempOrdre[4]); 
                oOrdre.setLe_Date(LedateFormat.format(Ledate));
                oOrdre.setLe_GPS(TempAddr);

                dbcon.createItmes(oOrdre);
                dbcon.close(); 
            }
            else
            {
                finish();
//              Intent GoToMain = new Intent(this, MainActivity.class);
//              startActivity(GoToMain);
            }


        }
        else{           
            Toast toast = Toast.makeText(getApplicationContext(), 
                "No scan data received!", Toast.LENGTH_SHORT);
            toast.show();
        }
    }

如您所见,我有 5 个主键。 问题:

  1. 我可以将 null 值插入 KEY_GPSOrdre,这很奇怪,因为我知道主键不允许 null 值

  2. 我可以插入相同的键值(双精度),通常会拒绝它。

我是这样编辑的:

private static final String TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " +
            tableName + "( "+ KEY_CodeClient + " VARCHAR, "+ KEY_CodeDest +"  VARCHAR," + KEY_NoOrdre +"  VARCHAR,"+ KEY_Ordre_1 +"  VARCHAR,"+ KEY_Ordre_2 +"  VARCHAR, "
                            + KEY_DateOrdre + " DATE, "+ KEY_GPSOrdre +"  VARCHAR,"     
             + " PRIMARY KEY("+KEY_CodeClient+","+ KEY_NoOrdre+","+KEY_Ordre_1+","+KEY_DateOrdre+","+KEY_GPSOrdre+")"
             + " UNIQUE     ("+KEY_CodeClient+","+ KEY_NoOrdre+","+KEY_Ordre_1+","+KEY_DateOrdre+","+KEY_GPSOrdre+") ON CONFLICT REPLACE)";

但我仍然可以创建双倍。 我的数据是:

Code Client  NoORdre    Key1Ordre   DateOrdre             GPSOrdre
1406         2555       1           11/08/2014 16:30      NULL
1406         2555       1           11/08/2014 16:30      NULL

我再次编辑:

private static final String TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " +
            tableName + "( "+ KEY_CodeClient + " VARCHAR, "+ KEY_CodeDest +"  VARCHAR," + KEY_NoOrdre +"  VARCHAR,"+ KEY_Ordre_1 +"  VARCHAR,"+ KEY_Ordre_2 +"  VARCHAR, "
                            + KEY_DateOrdre + " DATE, "+ KEY_GPSOrdre +"  VARCHAR,"     
             + " PRIMARY KEY("+KEY_CodeClient+","+ KEY_NoOrdre+","+KEY_Ordre_1+","+KEY_DateOrdre+","+KEY_GPSOrdre+")"
             + " UNIQUE     ("+KEY_CodeClient+","+ KEY_NoOrdre+","+KEY_Ordre_1+","+KEY_DateOrdre+","+KEY_GPSOrdre+") ON CONFLICT REPLACE)";

    private static final String UNIQUE_INDEX = "CREATE UNIQUE INDEX idx_Ordre ON "+tableName+
                          "("+KEY_CodeClient+","+ KEY_NoOrdre+","+KEY_Ordre_1+","+KEY_DateOrdre+","+KEY_GPSOrdre+")";

@Override
    public void onCreate(SQLiteDatabase db) {
      // TODO Auto-generated method stub
      Log.w(TAG, TABLE_CREATE);   
      db.execSQL(TABLE_CREATE);
      db.execSQL(UNIQUE_INDEX);
    }

但还是不行,我还有双倍的。

【问题讨论】:

    标签: android sqlite insert


    【解决方案1】:

    你没有五个主键,你有一个由五列组成的复合主键。

    对于插入 NULL,请考虑following

    具有主键的表中的每一行在其主键列中必须具有唯一的值组合。为了确定主键值的唯一性,NULL 值被认为不同于所有其他值,包括其他 NULL。

    对于插入相同的值,重要的是构成复合键的所有列的组合。

    如果要将列限制为唯一值,请对其使用 UNIQUE 约束。

    【讨论】:

    • 你能告诉我如何使 5 列唯一吗?语法?
    • 您究竟想让什么与众不同?每列都是孤立的?
    • 可能是这样的 + " UNIQUE("+KEY_CodeClient+","+ KEY_NoOrdre+","+KEY_Ordre_1+","+KEY_DateOrdre+","+KEY_GPSOrdre+")
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2020-11-11
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    相关资源
    最近更新 更多