2011-11-27 11 views
14

Antes de entrar en la descripción del problema, me gustaría señalar que conozco los otros hilos que hacen esta pregunta, sin embargo, ninguno ha sido capaz de resolver mi problema.¿Solo permite la entrada de datos única con Android SQLite?

He estado trabajando en una aplicación para compartir usando BumpAPI, que al recibir el fragmento, lo guarda en una base de datos SQLite para recuperarlo en una actividad de vista de lista, todo funciona bien y los datos se guardan, sin embargo si el mismo texto se envía dos veces, se guardará una y otra vez, y la vista de lista lo mostrará, por lo que he leído, ¿necesito el identificador 'ÚNICO'? sin embargo, al ser completamente nuevo en SQL, no puedo lograrlo, aquí está mi clase DataHelper que estoy usando para crear y agregar las entradas, ¿alguien sería tan amable de modificarla o informarme de una posible solución?

Muchas gracias

public class DataHelper { 

    private static final String DATABASE_NAME = "tags.db"; 
    private static final int DATABASE_VERSION = 1; 
    private static final String TABLE_NAME = "TagTable"; 

    private Context context; 
    private SQLiteDatabase db; 

    private SQLiteStatement insertStmt; 
    private static final String INSERT = "insert into " 
     + TABLE_NAME + "(name) values (?)"; 

    public DataHelper(Context context) { 
     this.context = context; 
     OpenHelper openHelper = new OpenHelper(this.context); 
     this.db = openHelper.getWritableDatabase(); 
     this.insertStmt = this.db.compileStatement(INSERT); 
    } 

    public long insert(String name) { 
     this.insertStmt.bindString(1, name); 
     return this.insertStmt.executeInsert(); 

    } 



    public void deleteAll() { 
     this.db.delete(TABLE_NAME, null, null); 
    } 

    public List<String> selectAll() { 
     List<String> list = new ArrayList<String>(); 
     Cursor cursor = this.db.query(TABLE_NAME, new String[] { "name" }, 
     null, null, null, null, "name desc"); 
     if (cursor.moveToFirst()) { 
     do { 
      list.add(cursor.getString(0)); 
     } while (cursor.moveToNext()); 
     } 
     if (cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
     } 
     return list; 
    } 

    private static class OpenHelper extends SQLiteOpenHelper { 

     OpenHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)" + "text unique, " + "ON CONFLICT REPLACE"); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     onCreate(db); 
     } 
    } 
} 

Respuesta

38

Agregue la palabra clave unique a la columna.

db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT unique); 
0

parece que primero debe agregar índice único en la tabla comunicado

db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)" + "**name** unique, " + "ON CONFLICT REPLACE"); 

se evitará de tener dos entradas con los mismos nombres

la segunda Crear puede hacer selecciones para verificar la existencia de los datos antes de hacer realmente insertar

+0

que no parece estar funcionando, si puedo ver la base de datos SQL que tiene repetir de entrada de nuevo, hm – Broak

+0

resolvieron todo a mí mismo en el final! Es una pena que nadie haya intentado ayudar a responder, pero bueno, aquí está la solución si alguien la necesita: db.execSQL ("CREATE TABLE" + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT unique); – Broak

Cuestiones relacionadas