Можно ли использовать первичный ключ в текстовых полях в базе данных Android

Я создал простую таблицу, содержащую имя и адрес электронной почты лиц. Когда я даю запрос создания следующим образом:

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

Но это не работает. Во время работы я не получаю никаких исключений или ошибок, ни первичный ключ не работает. При просмотре таблицы с помощью браузера SQLite я заметил, что существует только четыре типа данных: Введите описание изображения здесь

Можно ли использовать первичный ключ только для целого числа? В том случае, если я хочу первичный ключ в текстовых полях. Спасибо. Это код, который я использовал:

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

}

Solutions Collecting From Web of "Можно ли использовать первичный ключ в текстовых полях в базе данных Android"

Согласно документации sqlite, использование TEXT в качестве типа данных для первичного ключа должно работать.

Я использовал ваш запрос, и вот он, таблица создана.

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

Введите описание изображения здесь

Введите описание изображения здесь

Теперь вот где все пошло не так.

Когда я снова запустил это

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

Ничего не случилось, никаких ошибок. Но он не обновил запись. Поэтому я заключу, что целостность данных есть, но вы не получаете никакой информации об отказе .

SQLiteDatabase.insertOrThrow () должен генерировать исключение, если значение не может быть вставлено. Также его возвращаемые значения, а также одно из SQLiteDatabase.insert() – это rowid вставленной строки или -1 если она терпит неудачу. Вы должны выбрать любой из этих альтернатив в своем коде.