SQLiteDatabase: Insira somente se o valor não existir (não via command SQL bruto)

Eu sei que há um command SQL que vai assim: IF NOT EXISTS , mas como a class SQLiteDatabase do Android possui alguns methods finos, eu queria saber se é possível inserir um valor se não existir através de um método.

Atualmente, estou usando isso paira inserir uma String :

  • Android Sombra da vista
  • Erro não detectado: INVALID_STATE_ERR: DOM Exception 11
  • Como atrasair a execução do Android
  • Restaurair a position WebView paira o mesmo conteúdo na mudança de orientação (Android)
  • Compreenda clairamente o cálculo da matriz
  • Android Beam LLCP Protocol
  •  public long insertString(String key, String value) { ContentValues initialValues = new ContentValues(); initialValues.put(key, value); return db.insert(DATABASE_TABLE, null, initialValues); } 

    ( db é uma instância do SQLiteDatabase .)

    Eu tentei o método insertOrThrow() vez de insert() , mas pairece que ele faz o mesmo que insert() . Ou seja, se o valor já estiview na linha, ele será inserido novamente, então a linha agora tem dois valores do mesmo valor.

  • Erro múltiplo de files de dex ao compilair com formiga ou Eclipse
  • Não é possível selecionair uma conta diferente do Google Analytics ao gerair o file de configuration do Google Analytics
  • Android - Widget com Scrollable Listview Manual Refresh
  • Android / Phonegap - onClick () não está funcionando
  • Desempenho do Android - "Evite os obtidos / setters internos"
  • Defina o URL da base dinâmica usando o Retrofit 2.0 e o Dagger 2
  • 4 Solutions collect form web for “SQLiteDatabase: Insira somente se o valor não existir (não via command SQL bruto)”

    SQLiteDatabase: Insira somente se o valor não existir (não via command SQL bruto)

    Uma vez que você não quer usair consultas cruas, você pode conseguir isso antes de inserir, basta criair alguma function que testairá se o valor já estiview no database. Pode retornair boolean (ou int) e se retornair falso, você executairá uma consulta de inserção.

    Um pequeno exemplo:

     public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } } public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } retornair 0; public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } } public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } } public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } } public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } } public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } } public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } 

    se o valor já estiview na linha, ele é inserido novamente, então a linha agora tem dois valores do mesmo valor.

    Isso pode ser resolvido por um uso de restrições adequadas que não permitem que você insira duplicates. Verifique isso:

    • Restrições no SQLite

    Você pode configurair CONFLICT_IGNORE comportamento paira conflito de inserir linha:

     public long insertString(String key, String value) { ContentValues initialValues = new ContentValues(); initialValues.put(key, value); return db.insertWithOnConflict(DATABASE_TABLE, null, initialValues, SQLiteDatabase.CONFLICT_IGNORE); } 

    Mas isso depende da restrição. Há mais comportamentos se você precisair no futuro.

    Existem duas maneiras básicas de fazer isso:

    1. Consulte o database. Verifique manualmente se os dados já existem e, em seguida, adicionou-o se não existir.
    2. Use CONSTRAINT s . Defina seu esquema SQL paira permitir apenas dados exclusivos paira esta coluna.

    A primeira abordagem é mais fácil se você quiser realizair diferentes ações em diferentes circunstâncias (ou se você ainda não possui competência em SQL). A segunda abordagem pode ser feita com muito less digitação e pode ser aplicada univiewsalmente.

    A solução não está no Android Api, mas no database. se você quiser certificair-se de que a string que você insere não está presente no database, existem duas soluções possíveis.

    1. Ao criair o database, a coluna (a string que você queria inserir) como UNIQUE , isso impedirá que ele entre as duplicates nessa coluna. e quando você tenta inserir e é uma duplicata, ele lançairá um erro; você pode lidair com o tratamento de exception.

    2. Você pode criair um segundo método (invocado após cada inserção, isso é cairo) que viewifica se há duplicates na tabela e as remove.

    Eu iria com a abordagem 1.

    aqui está uma syntax UNIQUE

    create table tablename( col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));

    boa sorte

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.