Vraag Is het mogelijk om de primaire sleutel toe te passen op de tekstvelden in de Android-database


Ik heb een eenvoudige tabel gemaakt met de naam en e-mail-id's van de personen. Wanneer ik de maakvraag als volgt geef:

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

Maar dit werkt niet. Ik krijg geen uitzondering of fout tijdens het uitvoeren en de primaire sleutel werkt niet. Tijdens het bladeren door de tabel met SQLite-browser, merkte ik dat er maar vier gegevenstypen zijn:

enter image description here

Is het mogelijk om de primaire sleutel alleen toe te passen op integer? Wat is het geval als ik de primaire sleutel op tekstvelden wil hebben. Dank je. Dit is de code die ik heb gebruikt:

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

19
2017-09-29 01:31


oorsprong


antwoorden:


volgens de FAQ van sqlite documentatie, met behulp van TEXT als een data type voor primaire sleutel zou moeten werken.

ik heb je vraag gebruikt en hier is het, de tafel is gemaakt.

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

nu is hier waar het fout ging.

toen ik dit opnieuw deed

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

er gebeurde niets, geen fouten. Maar het heeft de record niet bijgewerkt. dus ik besluit data-integriteit is er maar je krijgt geen feedback over de mislukking.


18
2017-09-29 01:58



SQLiteDatabase.insertOrThrow () zou een uitzondering moeten werpen als de waarde niet kon worden ingevoegd. Ook zijn retourwaarden, evenals die van SQLiteDatabase.insert() is de rowid van de ingevoegde rij of -1 als het mislukt. U moet kiezen voor een van deze alternatieven in uw code.


10
2017-09-29 02:19