2014-08-30 102 views
0

我寫了簡單的DataBaseHelper在android中使用SQlite。創建課後爲:Android獲取錯誤插入到數據庫和代碼19:約束失敗

public class DatabaseHandler extends SQLiteOpenHelper{ 

     private static String DB_PATH     = ""; 

     private static final String DATABASE_NAME  = "tsms"; 

     private static String RECEIVE_FIELDS_TABLE  = "ReceiveFields"; 

     private static final String COLUMN_ID   = "id"; 

     private static final String COLUMN_LASTID  = "lastId"; 

     private static final String COLUMN_SMSNUMBER = "smsNumber"; 

     private static final String COLUMN_MOBILENUMBER = "mobileNumber"; 

     private static final String COLUMN_SENDERNAME = "senderName"; 

     private static final String COLUMN_SMSBODY  = "smsBody"; 

     private static final String COLUMN_RECEIVEDATE = "receiveDate"; 

     private static final int DATABASE_VERSION = 1; 

     private SQLiteDatabase mDataBase; 

     /* UPDATE DATABASE_CREATE FIELD*/ 

     private static final String DATABASE_CREATE = "CREATE TABLE " + RECEIVE_FIELDS_TABLE + "(" 
      + COLUMN_ID   + " INTEGER UNIQUE , " 
      + COLUMN_LASTID  + " INTEGER UNIQUE , " 
      + COLUMN_SMSNUMBER + " VARCHAR UNIQUE , " 
      + COLUMN_MOBILENUMBER + " VARCHAR , " 
      + COLUMN_SENDERNAME + " VARCHAR , " 
      + COLUMN_SMSBODY  + " TEXT , " 
      + COLUMN_RECEIVEDATE + " VARCHAR , PRIMARY KEY (" + COLUMN_ID + ", " + COLUMN_LASTID + ", " + "))"; 

    private Context context; 

    public DatabaseHandler(Context context) { 

     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

    } 


    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase) { 

     sqLiteDatabase.execSQL(DATABASE_CREATE); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 


     sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + RECEIVE_FIELDS_TABLE); 

     // Create tables again 
     onCreate(sqLiteDatabase); 
    } 

    // Adding new fields 
    public void addToReceived(ReceiveFields fields) { 

     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 

     values.put(COLUMN_LASTID,  fields.getLastId());   // ReceiveFields last ID 

     values.put(COLUMN_MOBILENUMBER, fields.getMobileNumber());  // ReceiveFields Mobile Number 

     values.put(COLUMN_SENDERNAME, fields.getSenderName());  // ReceiveFields Mobile Number 

     values.put(COLUMN_SMSBODY,  fields.getSmsBody());   // ReceiveFields Mobile Number 

     values.put(COLUMN_SMSNUMBER, fields.getSmsNumber());  // ReceiveFields Mobile Number 

     values.put(COLUMN_MOBILENUMBER, fields.getMobileNumber());  // ReceiveFields Mobile Number 

     values.put(COLUMN_RECEIVEDATE, String.valueOf(fields.getReceiveDate())); // ReceiveFields Mobile Number 

     // Inserting Row 
     db.insert(RECEIVE_FIELDS_TABLE, null, values); 

     db.close(); // Closing database connection 
    } 
} 

我得到錯誤插入到數據庫是這樣的:

db.addToReceived(new ReceiveFields(

          Long.valueOf(str1[0]), 

          str1[1], 

          str1[2], 

          URLDecoder.decode(str1[3], "UTF-8"), 

          URLDecoder.decode(str1[4], "UTF-8"), 

          ct.getGregorianDate())); 

Log.i結果:

29904757 30007227 00120504001 00120504001  sssasaS  2014/8/3 

全LogCate結果:

08-28 06:35:29.974 2698-2698/ir.tsms E/Database﹕ Error inserting lastId=29904755 receiveDate=2014/8/3 senderName=09127574751 mobileNumber=09127574751 smsNumber=30007227 smsBody= 
    android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 
      at android.database.sqlite.SQLiteStatement.native_execute(Native Method) 
      at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55) 
      at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1549) 
      at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410) 
      at ir.tsms.DataBase.DatabaseHandler.addToReceived(DatabaseHandler.java:96) 
      at ir.tsms.wsdl.TSMS.getReceivedSMS(TSMS.java:141) 
      at ir.tsms.Receive.ResivedSMS.getResivedSMS(ResivedSMS.java:41) 
      at ir.tsms.Receive.ResivedSMS.<init>(ResivedSMS.java:36) 
      at ir.tsms.Activities.DashboardActivity.onTabSelected(DashboardActivity.java:160) 
      at android.support.v7.app.ActionBarImplBase.selectTab(ActionBarImplBase.java:486) 
      at android.support.v7.app.ActionBarImplBase.addTab(ActionBarImplBase.java:410) 
      at android.support.v7.app.ActionBarImplBase.addTab(ActionBarImplBase.java:401) 
      at ir.tsms.Activities.DashboardActivity.onCreate(DashboardActivity.java:68) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
      at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:123) 
      at android.app.ActivityThread.main(ActivityThread.java:4627) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:521) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
      at dalvik.system.NativeStart.main(Native Method) 

at ir.tsms.wsdl.TSMS.getReceivedSMS(TSMS.java:141)行是:

db.addToReceived(new ReceiveFields(

回答

2

檢查這些東西,它可能導致由這些原因:

1 - 你沒加COLUMN_IDvalues所以它是空的。

2- COLUMN_IDCOLUMN_LASTIDUNIQUE(clear your database or android app data , maybe it stored in your db first time you ran it and now again you want to add you can not because it is not unique now, every time you run, your db is in memory and it is not clread, in order to clear it you must remove app data or run delete SQL statement)

,所以我建議你看看你的數據庫文件,如果你使用Eclipse試試這個:

http://www.tylerfrankenstein.com/browse-android-emulator-sqlite-database-eclipse

3- COLUMN_IDCOLUMN_LASTID不int我的意思是fields.getLastId()可能會返回String

檢查你的表格定義和您的值插入!

+0

我編輯了我的文章! – mmlooloo 2014-08-30 17:42:36

+0

'COLUMN_ID'必須爲'UNIQUE'和'AutoIncrement'爲空 – 2014-08-30 17:59:49

+0

我知道,但你沒有添加'AutoIncrement' – mmlooloo 2014-08-30 18:11:42

0

好像你正試圖插入nullsmsBody但你的表不允許你這樣做,因爲它有NOT NULL約束此列。

+0

如何更改'+ COLUMN_SMSBODY +「TEXT NOT NULL check(typeof(」+ COLUMN_SMSBODY +「)='text'),」'將方法更正爲接受null – 2014-08-30 12:16:10

+0

刪除NOT NULL'語句我想? – cliffroot 2014-08-30 12:16:52

+0

更新後的'DATABASE_CREATE字段'先生。沒有解決問題 – 2014-08-30 12:23:46

相關問題