2013-05-06 40 views
0

我第二次插入數據時出現此錯誤。它在第一次在數據庫中插入數據時工作正常。但後來我的應用程序被迫關閉或項目添加,但不能在列表視圖中顯示。 我logcat的樣子,當我嘗試插入第二個記錄android.database.sqlite.SQLiteConstraintException:錯誤代碼19:插入多條記錄時約束失敗

05-06 04:14:06.220: E/SQLiteDatabase(773): Error inserting imei_id=0 c_addr=54  i_date=6/5/2013 c_nm=rte e_date=6/5/2013 cl_no=tre exe_flg=true l_no=65 l_type=dfdg 
05-06 04:14:06.220: E/SQLiteDatabase(773): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 
05-06 04:14:06.220: E/SQLiteDatabase(773): at android.database.sqlite.SQLiteStatement.native_executeInsert(Native Method) 
05-06 04:14:06.220: E/SQLiteDatabase(773): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:113) 
05-06 04:14:06.220: E/SQLiteDatabase(773): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718) 
05-06 04:14:06.220: E/SQLiteDatabase(773): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591) 
05-06 04:14:06.220: E/SQLiteDatabase(773): at com.smartwallet.database.DbAdapterDLicense.insertDL(DbAdapterDLicense.java:49) 
05-06 04:14:06.220: E/SQLiteDatabase(773): at com.exampl.smartwallet.Add_DLicense.onClick(Add_DLicense.java:139) 

我的類添加記錄

package com.exampl.smartwallet; 

import java.util.Calendar; 

import com.smartwallet.database.DbAdapterDLicense; 

import android.app.Activity; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.DatePicker; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class Add_DLicense extends Activity implements OnClickListener 
{ 
private TextView et_idt,et_edt; 
private EditText et_cnm,et_lno,et_add,et_cno,et_ltype; 
private Button bt_add; 
private Long dlid,l;  
private int mYear,mMonth, mDay; 
static final int DATE_DIALOG_IDI = 0; 
static final int DATE_DIALOG_IDE = 1; 
private DatePickerDialog.OnDateSetListener mDateSetListenerI; 
private DatePickerDialog.OnDateSetListener mDateSetListenerE; 
private DbAdapterDLicense DBA; 
//private TelephonyManager tm; 
private String imei="9898"; 

@Override 
public void onCreate(Bundle b) 
{ 
    super.onCreate(b); 
    setContentView(R.layout.add_dlicense); 
    dlid=null; 
    Bundle extras=getIntent().getExtras(); 

    dlid=(b==null)? null:(Long)b.getSerializable("imei_id"); 
    if(extras!=null) 
    { 
     dlid=extras.getLong("imei_id"); 
    } 

    DBA=new DbAdapterDLicense(this); 
    DBA.open(); 


    et_cnm=(EditText)findViewById(R.id.et_cnm); 
    et_idt=(TextView)findViewById(R.id.et_idt); 
    et_edt=(TextView)findViewById(R.id.et_edt); 
    et_lno=(EditText)findViewById(R.id.et_lno); 
    et_add=(EditText)findViewById(R.id.et_add); 
    et_cno=(EditText)findViewById(R.id.et_cno); 
    et_ltype=(EditText)findViewById(R.id.et_ltype); 
    et_idt.setOnClickListener(this); 
    et_edt.setOnClickListener(this); 

    bt_add=(Button)findViewById(R.id.bt_save); 

    bt_add.setOnClickListener(this);   

    mDateSetListenerI = new DatePickerDialog.OnDateSetListener() 
    { 
      public void onDateSet(DatePicker view, int year, 
            int monthOfYear, int dayOfMonth) 
      { 
       mYear = year; 
       mMonth = monthOfYear; 
       mDay = dayOfMonth; 
       updateDisplay1(); 
      } 
     }; 

     final Calendar c1 = Calendar.getInstance(); 
     mYear = c1.get(Calendar.YEAR); 
     mMonth = c1.get(Calendar.MONTH); 
     mDay = c1.get(Calendar.DAY_OF_MONTH); 

     updateDisplay1(); 
     mDateSetListenerE = new DatePickerDialog.OnDateSetListener() 
     { 
       public void onDateSet(DatePicker view, int year, 
             int monthOfYear, int dayOfMonth) 
       { 
        mYear = year; 
        mMonth = monthOfYear; 
        mDay = dayOfMonth; 
        updateDisplay2(); 
       } 
      }; 

    final Calendar c = Calendar.getInstance(); 
    mYear = c.get(Calendar.YEAR); 
    mMonth = c.get(Calendar.MONTH); 
    mDay = c.get(Calendar.DAY_OF_MONTH); 

    updateDisplay2(); 
} 

public boolean validate() { 

    if(et_cnm.getText().toString().equals("")) 
     return false; 
    if(et_lno.getText().toString().equals("")) 
     return false; 
    if(et_add.getText().toString().equals("")) 
     return false; 
    if(et_cno.getText().toString().equals("")) 
     return false; 
    if(et_ltype.getText().toString().equals("")) 
     return false; 
    return true; 
} 

@Override 
public void onClick(View v) 
{ 
    if(v.equals(et_idt)) 
     { 
      showDialog(DATE_DIALOG_IDI); 
     } 
     if(v.equals(et_edt)) 
     { 
      showDialog(DATE_DIALOG_IDE); 
     } 

    if(!validate()) { 
     Toast.makeText(this, "Blank fields are not allowed", Toast.LENGTH_SHORT).show(); 
     return; 
    } 
    if(v.equals(bt_add)) 
    { 
     if(dlid==null) 
     { 
      l = DBA.insertDL(0, et_cnm.getText().toString(),et_idt.getText().toString(),et_edt.getText().toString(),et_lno.getText().toString(),et_add.getText().toString(),et_cno.getText().toString(),et_ltype.getText().toString(),"true"); 
      Toast.makeText(Add_DLicense.this, "Item Added", 2000).show(); 
      imei+=l; 
      //DBA.updateDL(l, Long.parseLong(imei), et_cnm.getText().toString(),et_idt.getText().toString(),et_edt.getText().toString(),et_lno.getText().toString(), et_add.getText().toString(),et_cno.getText().toString(),et_ltype.getText().toString(),"true"); 
     } 
     finish(); 
    } 

} 
private void updateDisplay1() 
{ 
    et_idt.setText(""+mDay+"/"+(mMonth+1)+"/"+mYear); 
} 
private void updateDisplay2() 
{ 
    et_edt.setText(""+mDay+"/"+(mMonth+1)+"/"+mYear); 
} 

@Override 
    protected Dialog onCreateDialog(int id) 
    { 
     if(id==DATE_DIALOG_IDI) 
     { 
      return new DatePickerDialog(this, 
        mDateSetListenerI, 
        mYear, mMonth, mDay); 
     } 
     else if(id==DATE_DIALOG_IDE) 
     { 
      return new DatePickerDialog(this, 
        mDateSetListenerE, 
        mYear, mMonth, mDay); 
     } 
     return null; 
    } 

@Override 
protected void onDestroy() 
{ 
    // TODO Auto-generated method stub 
    DBA.close(); 
    super.onDestroy(); 
} 
} 

和將對DBAdapter查詢

public long insertDL(long imei_id,String c_nm,String i_date, String e_date,String l_no,String cl_no,String c_addr,String l_type,String exe_flg) 
{ 
    ContentValues values = createContentValues_dl(imei_id,c_nm,i_date, e_date, l_no,cl_no,c_addr,l_type,exe_flg); 
    return db.insert(T_DLICENSE, null, values); 
} 

和表CREATETABLE是

private static final String DRIVINGLICENSE 
= "create table DrivingLicense " + 
"(dlid integer primary key autoincrement, " + 
"imei_id int(20), " + 
"c_nm text not null,"+ 
"i_date text not null, " + 
"e_date text not null,"+ 
"l_no text not null,"+ 
"cl_no text not null,"+ 
"c_addr text not null,"+ 
"exe_flg text not null,"+ 
"l_type text not null,UNIQUE(imei_id));"; 

請幫我插入多條記錄。我已經搜索,但表面上找到解決方案。由於第一條記錄正確插入,但不超過該值...提前預先存儲。

回答

0

您爲列imei_id插入相同的值您不能這樣做,因爲它被聲明爲唯一的。

+0

所以我必須做的,然後???那可能有什麼解決辦法? – user2050129 2013-05-07 06:07:39

+0

不硬編碼「imei_id」值。在每次插入時增加值。爲什麼你有它呢?你把它硬編碼爲0? – 2013-05-07 06:11:48

+0

雅我硬編碼爲0.將嘗試此解決方案。 – user2050129 2013-05-07 11:55:06

0

失敗的約束表示您的插入違反了您在表創建中指定的約束。在你的情況下,這是很多字段不是null,一個是關鍵字,另一個是唯一的。你應該在這裏做什麼,是使用調試器,在插入之前停止代碼,並檢查所有值是你期望的,並滿足你的約束。你可能要檢查

一件事是外地imei_id - 你指定它是唯一的,但似乎你的電話的功能insertDL有這個作爲常量0 ..

相關問題