¿Es posible aplicar la clave principal en los campos de texto de la base de datos de Android?

Creé una tabla simple que contiene el nombre y las identificaciones de correo electrónico de las personas. Cuando estoy dando la consulta de creación de esta manera:

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

Pero esto no está funcionando. No recibo ninguna excepción o error mientras se ejecuta ni la clave principal está funcionando. Mientras navego por la tabla usando el navegador SQLite observé que solo hay cuatro tipos de datos:

enter image description here

¿Es posible aplicar la clave principal solo en un número entero? ¿Cuál es el caso si quiero clave principal en campos de texto? Gracias. Este es el código que utilicé:

 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; } } 

según el faq de la documentación de sqlite, debería funcionar el uso de TEXT como un tipo de datos para la clave principal.

utilicé su consulta y aquí está, se creó la tabla.

 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') 

enter image description here

enter image description here

ahora aquí es donde salió mal.

cuando corrí esto de nuevo

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

no pasó nada, no hubo errores. Pero no actualizó el registro. entonces llegué a la conclusión de que la integridad de los datos está ahí, pero no se recibe ningún comentario sobre el error .

SQLiteDatabase.insertOrThrow () debería arrojar una excepción si el valor no se pudo insertar. También sus valores de retorno, así como el de SQLiteDatabase.insert() es el rowid de la fila insertada o -1 si falla. Debe optar por cualquiera de estas alternativas en su código.