SQLite Spalte name ist nicht eindeutig Fehler?
Erstelle ich eine Datenbank für meine Anwendung eine Datenbank-helper-Klasse, die ich dann versuchen zum einfügen von Daten in es in einer anderen Klasse. Aber ich erhalte eine Fehlermeldung.
Ich erhalte die folgende Fehlermeldung in der Logcat und wissen nicht, wie es zu lösen? :
07-15 16:20:30.348: E/SQLiteDatabase(16270): Error inserting score=0 date=1405437630327 name=ry
07-15 16:20:30.348: E/SQLiteDatabase(16270): android.database.sqlite.SQLiteConstraintException: column name is not unique (code 19)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:976)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1591)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1461)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at com.example.multapply.DatabaseHelper.addScore(DatabaseHelper.java:84)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at com.example.multapply.RandomTest.onClick(RandomTest.java:161)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.view.View.performClick(View.java:4633)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.view.View$PerformClick.run(View.java:19330)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.os.Handler.handleCallback(Handler.java:733)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.os.Handler.dispatchMessage(Handler.java:95)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.os.Looper.loop(Looper.java:157)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at android.app.ActivityThread.main(ActivityThread.java:5356)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at java.lang.reflect.Method.invokeNative(Native Method)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at java.lang.reflect.Method.invoke(Method.java:515)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
07-15 16:20:30.348: E/SQLiteDatabase(16270): at dalvik.system.NativeStart.main(Native Method)
Code:
Datenbank-helper-Klasse:
package com.example.multapply;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 3;
// Database Name
private final static String DATABASE_NAME = "MultapplyDatabase";
// Contacts table name
private static final String TABLE_SCORE = "scores";
// Contacts Table Columns names
private static final String COL_NAME = "name";
private static final String COL_SCORE = "score";
private static final String COL_DATE = "date";
/**
* Constructor
* @param context
*/
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
/**
* Method that creates the database
*/
@Override
public void onCreate(SQLiteDatabase db) {
//NOTE: may need to alter the below to take out everything after INTEGER
String CREATE_TABLE_SCORE = "CREATE TABLE " + TABLE_SCORE + "("
+ COL_NAME + " STRING PRIMARY KEY," + COL_SCORE + " INTEGER," + COL_DATE + " LONG" + ")";
db.execSQL(CREATE_TABLE_SCORE);
}
/**
* Method that upgrades the database
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_SCORE);
// Create tables again
onCreate(db);
}
/**
* All CRUD operations
*/
// Adding new score details (Name, score, date)
void addScore(Score score) {
SQLiteDatabase db = this.getWritableDatabase();
//ContentValues- holds the values.
ContentValues values = new ContentValues();
values.put(COL_NAME, score.getName());
values.put(COL_SCORE, score.getScore());
values.put(COL_DATE, score.getDate());
// Inserting Row (i.e. the values that were entered from above
db.insert(TABLE_SCORE, null, values);
db.close(); // Closing database connection
}
/**
* Method will return a single Name and score
* @param id
* @return
*/
// Getting single contact
Score getScore(String name) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_SCORE, new String[] { COL_NAME,
COL_SCORE, COL_DATE}, COL_NAME + "=?",
new String[] { String.valueOf(name) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Score score = new Score(cursor.getString(0),Integer.parseInt(cursor.getString(1)),cursor.getLong(2));
// return contact
return score;
}
/**
* Method will return a list of all the scores
* @return
*/
// Getting All Contacts
public List<Score> getAllScores() {
List<Score> scoreList = new ArrayList<Score>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_SCORE;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Score score = new Score();
score.setName(cursor.getString(0));
score.setScore(Integer.parseInt(cursor.getString(1)));
score.setDate(cursor.getLong(2));
// Adding contact to list
scoreList.add(score);
} while (cursor.moveToNext());
}
// return contact list
return scoreList;
}
}
Code im Zusammenhang mit der Eingabe von Daten in die Datenbank:
/**
* CRUD Operations
* */
// Inserting Contacts
Log.d("Insert: ", "Inserting ..");
db.addScore(new Score(UserName.getUserName(), score, System
.currentTimeMillis()));
// Reading all contacts
Log.d("Reading: ", "Reading all contacts..");
List<Score> scores = db.getAllScores();
for (Score s : scores) {
String log = "Name: " + s.getName() + " ,Score: "
+ s.getScore() + "Date: " + s.getDate();
// Writing Contacts to log
Log.d("Details: ", log);
}
}
}
- Ich denke, Ihre Antwort ist im Titel. Hast du bereits etwas einfügen mit dem gleichen
name
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies bedeutet, dass Sie versuchen, verwenden Sie einen parameter in der Spalte "name", die bereits gespeichert oder verwendet werden, in Ihrer Datenbank, denn "name" ist ein Primärschlüssel
Sie sind in Verletzung der UNIQUE-Einschränkung, weil Sie Ihre Spalte Namen ist Primärschlüssel. Dies ist auf Grund SQLiteConstraintException.