2016-08-27 2 views
-1

データベースにアンドロイドでデータを挿入しようとしました。データベースへのインセット時のSQLiteConstraintException

この1つは動作します:

public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL(
      "create table study " + 
        "(percentage integer primary key,videoDuration text,totalTime text,date text)" 
    ); 
} 


public boolean insertStudy(String percentage, String videoDuration, String totalTime, String date) { 

    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("percentage", percentage); 
    contentValues.put("videoDuration", videoDuration); 
    contentValues.put("totalTime", totalTime); 
    contentValues.put("date", date); 
    db.insert("study", null, contentValues); 
    return true; 
} 

をしかし、私は(私は主キーのすべての列を持っていけないよう)のシリアル番号の1以上の列を追加しようとすると、挿入している間、私はエラーを取得します。それはシリアルに挿入する値を保持し、また、主キーとして機能するように、私はカウンターとしてのserialNumberを使用しています

public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL(
      "create table study " + 
        "(serial integer primary key,percentage text,videoDuration text,totalTime text,date text)" 
    ); 
} 


public boolean insertStudy(String percentage, String videoDuration, String totalTime, String date) { 
    serialNumber++; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("serial", serialNumber); 
    contentValues.put("percentage", percentage); 
    contentValues.put("videoDuration", videoDuration); 
    contentValues.put("totalTime", totalTime); 
    contentValues.put("date", date); 
    db.insert("study", null, contentValues); 
    return true; 

} 

これは新しいコード(動作しない)です。私はこのコードでエラーが発生しています:

Error inserting date=27/08/2016 percentage=2.6 serial=1 totalTime=0:0:1 videoDuration=22:96 
android.database.sqlite.SQLiteConstraintException: PRIMARY KEY must be unique (code 19) 

私はなぜ最初に動作していますが、2番目ではないのか分かりません。 2番目のコードが機能しない理由を理解したい。

私のアプリケーションは最初のコードで動作することができますが、将来はバグが発生する可能性がありますので、2番目のコードを使用します。

+2

パーセンテージをプライマリキーとして保持しているため、プライマリキーが重複している場合は、Base._IDをプライマリキーにして自動インクリメントしてください。独自のものを使用する場合は、アイは重複していません。 –

+0

何かをする前に、StackOverflowに投稿するよりも、例外やエラーをGoogleに迅速かつ効果的に伝えることができます。 ** A **。あなたはダウンボートを避けるでしょう、** B ** **これはあなたの検索クエリを改善する方法です。 – Sufian

+0

[sqlite制約例外プライマリキーは重複している可能性があります](http://stackoverflow.com/questions/26986687/sqlite-constraint-exception-primary-key-must-be-unique) – Sufian

答えて

0

自動インクリメントを追加し、手動でIDの設定を削除し、それを試してみてください。

db.execSQL(
     "create table study " + 
       "(serial integer primary key AUTOINCREMENT ,percentage text,videoDuration text,totalTime text,date text)" 
); 

public boolean insertStudy(String percentage, String videoDuration, String totalTime, String date) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("percentage", percentage); 
    contentValues.put("videoDuration", videoDuration); 
    contentValues.put("totalTime", totalTime); 
    contentValues.put("date", date); 
    db.insert("study", null, contentValues); 
    return true; 
} 

public boolean insertStudy(String percentage, String videoDuration, String totalTime, String date) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("percentage", percentage); 
    contentValues.put("videoDuration", videoDuration); 
    contentValues.put("totalTime", totalTime); 
    contentValues.put("date", date); 
    db.insert("study", null, contentValues); 
    return true; 
} 
+0

ありがとう、その今働いている。 –

1

シリアル列は一意の値のみを受け入れます。エラーは、それが一意である必要があります示唆したように

ちょうど更新

db.execSQL("create table study (serial integer,percentage text,videoDuration text,totalTime text,date text)"); 
0

割合は、主キーを使用することができない、推奨されるアプローチはidフィールドを追加することです。

db.execSQL(
"create table study " + 
"(id integer primary key, percentage,videoDuration text,totalTime text,date text)" 
); 
+0

あなたはこのことを見ることができます心配しない場合、[質問..](http://stackoverflow.com/questions/39268248/access-email-id-along-with-name-and-phone-number-from-contact-リストインアンドロイド).. –

0

テーブルを作成している間、主キーの自動インクリメントを作るようidとそれを取る:

db.execSQL("create table study (id integer primary key autoincrement, serial integer,percentage text,videoDuration text,totalTime text,date text)" 
); 
+0

ありがとうございました。私はIDがシリアル番号を提供するために存在するので、シリアルを削除しました。 –

関連する問題