Ist es möglich, Primärschlüssel auf die Textfelder in Android-database anzuwenden

Ich habe eine einfache Tabelle erstellt, die den Namen und die E-Mail-ID der Personen enthält. Wenn ich die create-Abfrage so gebe:

"create table contacts (name text not null, email text primary key not null);"

Aber das funktioniert nicht. Ich bekomme weder eine Exception noch einen Fehler beim Laufen noch funktioniert der Primärschlüssel. Beim Durchsuchen der Tabelle mit dem SQLite-Browser habe ich festgestellt, dass es nur vier Datentypen gibt:

Bildbeschreibung hier eingeben

Ist es möglich, den Primärschlüssel nur auf Integer anzuwenden? Was ist der Fall, wenn ich einen Primärschlüssel für Textfelder haben möchte? Vielen Dank. Dies ist der Code, den ich verwendet habe:

 public class DBAdapter { public static final String KEY_ROWID = "_id"; public static final String KEY_NAME = "name"; public static final String KEY_EMAIL = "email"; private static final String TAG = "DBAdapter"; private static final String DATABASE_NAME = "MyDB"; private static final String DATABASE_TABLE = "contacts"; private static final int DATABASE_VERSION = 2; private static final String DATABASE_CREATE = "create table contacts (_id integer primary key autoincrement, " + "name text not null, email text not null);"; private final Context context; private DatabaseHelper DBHelper; private SQLiteDatabase db; public DBAdapter(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(DATABASE_CREATE); } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS contacts"); onCreate(db); } } //---opens the database--- public DBAdapter open() throws SQLException { db = DBHelper.getWritableDatabase(); return this; } //---closes the database--- public void close() { DBHelper.close(); } //---insert a contact into the database--- public long insertContact(String name, String email) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_NAME, name); initialValues.put(KEY_EMAIL, email); return db.insert(DATABASE_TABLE, null, initialValues); } //---deletes a particular contact--- public boolean deleteContact(long rowId) { return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; } //---retrieves all the contacts--- public Cursor getAllContacts() { return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_EMAIL}, null, null, null, null, null); } //---retrieves a particular contact--- public Cursor getContact(long rowId) throws SQLException { Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_EMAIL}, KEY_ROWID + "=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; } //---updates a contact--- public boolean updateContact(long rowId, String name, String email) { ContentValues args = new ContentValues(); args.put(KEY_NAME, name); args.put(KEY_EMAIL, email); return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; } } 

Laut der FAQ der SQLite-Dokumentation sollte die Verwendung von TEXT als Datentyp für den Primärschlüssel funktionieren.

Ich habe Ihre Abfrage verwendet und hier ist es, die Tabelle wird erstellt.

 CREATE TABLE contacts ( email text primary key not null, name text not null); INSERT INTO contacts VALUES ('sample@email.com', 'sample') INSERT INTO contacts VALUES ('people@email.com', 'sample') 

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

jetzt ist hier, wo es falsch gelaufen ist.

als ich das nochmal durchführte

 INSERT INTO contacts VALUES ('sample@email.com', 'sample') 

nichts ist passiert, keine Fehler. Aber es hat den Rekord nicht aktualisiert. So schließe ich die Datenintegrität ist da, aber Sie erhalten keine Rückmeldung über den Fehler .

SQLiteDatabase.insertOrThrow () sollte eine Ausnahme auslösen, wenn der Wert nicht eingefügt werden konnte. Auch seine Rückgabewerte, sowie der von SQLiteDatabase.insert() ist die rowid der eingefügten Zeile oder -1 wenn es fehlschlägt. Sie sollten sich in Ihrem Code für eine dieser Alternativen entscheiden.