2011-09-29 7 views
19

Ho creato una semplice tabella che contiene il nome e l'e-mail delle persone. Quando sto dando il creare query come questa:E 'possibile applicare la chiave primaria sui campi di testo nel database Android

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

Ma questo non sta funzionando. Non ricevo alcuna eccezione o errore durante l'esecuzione, né la chiave primaria funziona. Durante la navigazione la tabella utilizzando il browser SQLite ho osservato che ci sono tipi di dati: solo quattro

enter image description here

E 'possibile applicare chiave primaria solo su interi? Qual è il caso se voglio la chiave primaria sui campi di testo. Grazie. Questo è il codice che ho usato:

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

Puoi pubblicare il codice che crea la tabella? – Noel

risposta

18

come da faq documentazione SQLite, utilizzando TEXT come un tipo di dati per la chiave primaria dovrebbe funzionare.

Ho usato la tua query ed eccola, la tabella è stata creata.

CREATE TABLE contacts (email text primary key not null, name text not null); 

INSERT INTO contacts VALUES ('[email protected]', 'sample') 
INSERT INTO contacts VALUES ('[email protected]', 'sample') 

enter image description here

enter image description here

Ora qui è dove è andata male.

quando mi sono imbattuto è accaduto di nuovo

INSERT INTO contacts VALUES ('[email protected]', 'sample') 

nulla, nessun errore. Ma non ha aggiornato il record. quindi concludo l'integrità dei dati ma non si ottiene alcun feedback sull'errore.

+0

si. Capito. Grazie per la risposta – Pramod

+0

come sapere inserire il valore duplicato? – sai

+0

@sai, per favore leggi le ultime due righe nel mio post. – Samuel

10

SQLiteDatabase.insertOrThrow() dovrebbe generare un'eccezione se il valore non può essere inserito. Anche i suoi valori di ritorno, come pure quello da SQLiteDatabase.insert() è il rowid della riga inserita o -1 se fallisce. Dovresti optare per una qualsiasi di queste alternative nel tuo codice.

Problemi correlati