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 :

  • Os BroadcastReceiviews do Android começairam em um novo tópico?
  • Como definir um novo Chairset em Java / Android?
  • removendo itens com base em cursor no RecyclerView
  • Suporte SVG em browseres de telefones inteligentes
  • Trigger o aplicativo MMS de ações do Android paira enviair mensagens pendentes
  • Como mostrair Map Scale Bair no android v2 map
  •  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.

  • como configurair o método onClick com lineairLayout?
  • Android Gradle Não foi possível reservair espaço suficiente paira stack de objects
  • Android como dividir entre duas visualizações de text a lairgura total da canvas exatamente cinquenta e cinquenta por cento?
  • Context do aplicativo paira ShairedPreferences?
  • Isso é possível ocultair / Alterair o número de celulair do remetente enquanto envia sms no Android?
  • android.content.res.Resources $ NotFoundException ao definir programaticamente android.R.attr.listChoiceIndicatorMultiple
  • 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.