2012-08-01 44 views
3

我重構我的代碼,並與insert or replace更換所有insert報表,而我發現,使用db.insert(),而不是一份聲明中下面的方法:insertWithOnConflict()與插入或更換

public static void insertIntoTableByNameAndFieldsAndValues(
     String tableName, String[] fields, String[] values, Context c) 
     throws FieldsAndValuesMismatchException, UnrecognizedTypeException { 

    DatabaseAbstractionLayer dal = new DatabaseAbstractionLayer(c); 
    SQLiteDatabase db = dal.getWritableDatabase(); 

    ContentValues con = new ContentValues(); 

    if (fields.length != values.length) 
     throw new FieldsAndValuesMismatchException(
       "fieldsString and values are not the same size"); 

    int fieldCount = fields.length; 

    for (int i = 0; i < fieldCount; i++) { 
     String[] fieldArr = fields[i].split(":"); 
     String value = values[i]; 
     if (fieldArr[1].equalsIgnoreCase("long")) { 
      // long 
      if(value.equalsIgnoreCase("null")){ 
       con.putNull(fieldArr[0]); 
      }else{ 
       con.put(fieldArr[0],(long) Integer.parseInt(value)); 
      } 
     } else if (fieldArr[1].equalsIgnoreCase("string") || fieldArr[1].equalsIgnoreCase("text")) { 
      // string 

      if(value.equalsIgnoreCase("null")){ 
       con.putNull(fieldArr[0]); 
      }else{ 
       con.put(fieldArr[0], value); 
      } 


     }else if(fieldArr[1].equalsIgnoreCase("double")){ 
      //double 

      if(value.equalsIgnoreCase("null")){ 
       con.putNull(fieldArr[0]); 
      }else{ 
       con.put(fieldArr[0], Double.valueOf(value)); 
      } 

     } else { 
      throw new UnrecognizedTypeException(fieldArr[1] 
        + " is not string,text, long or double"); 
     } 
    } 

    db.insert(tableName, null, con); 

db.close(); 
} 

我不想重寫代碼並使用原始查詢。 當發生衝突時,是否有辦法替換行?我想insertWithOnConflict()會這樣做,但我找不到一個很好的例子。

回答

15

是啊,(其他城市BaseColumns._ID到合適的,如果你不遵循由Android使用的行標識符標準名稱的東西),這應該做你想要什麼:

db.insertWithOnConflict(tableName, BaseColumns._ID, v, 
     SQLiteDatabase.CONFLICT_REPLACE); 

但是 - 這種方法肯定做了很多毫無意義的事情。總之,它可以歸結爲:

public static void insertIntoTableByNameAndFieldsAndValues(
    String tableName, String[] fields, String[] values, Context c) 
    throws FieldsAndValuesMismatchException { 

    if (fields.length != values.length) { 
     throw new FieldsAndValuesMismatchException(
      "fields[] and values[] are not the same length"); 
    } 
    ContentValues v = new ContentValues(); 
    // You really don't need to distinguish between integers, doubles 
    // etc. etc. - SQLite is type agnostic, just dumping Strings from Java 
    // will work just fine - the *only* point in converting stuff is to check 
    // the format prior to inserts. 
    // Using "null" as the null identifier is also pointless. Pass actual null 
    // values instead - calling #putNull("somecolumn") is the same 
    // as #put("somecolumn", null) 
    for (int i = 0; i < fields.length; i++) { 
     v.put(fields[i], values[i]); 
    } 
    db.insertWithOnConflict(tableName, BaseColumns._ID, v, 
      SQLiteDatabase.CONFLICT_REPLACE); 
} 
+0

非常感謝;) – danrah 2012-08-01 12:25:19