- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在重构我的代码并将所有 insert
语句替换为 insert or replace
而我发现以下方法使用 db.insert()
而不是准备好的语句:
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()
会这样做,但我找不到一个好的例子。
最佳答案
是的,(如果您不遵循 Android 使用的行标识符的标准名称,请将 BaseColumns._ID
更改为合适的名称)这应该可以满足您的要求:
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);
}
关于android - insertWithOnConflict() 与插入或替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11757141/
我正在重构我的代码并将所有 insert 语句替换为 insert or replace 而我发现以下方法使用 db.insert() 而不是准备好的语句: public static void in
我在 Android/SQLite 中使用 insertWithOnConflict 函数来插入可能已经存在于数据库中的值。根据 Android 文档,如果该值存在,将返回主键: Returns th
我正在使用 SQLiteDatabase.CONFLICT_IGNORE 调用 insertWithOnConflict。但是,当发生冲突时,将返回“-1”而不是现有行的 ID。我该如何纠正这个问题?
我试图了解 SQLiteDatabase.insertWithOnConflict 的返回值。 我的代码是这样的: long result = db.insertWithOnConflict(
我需要插入或更新,我找到了 SQLiteDatabase 的 insertWithOnConflict 方法,但我不知道它如何检查该条目是否已存在。 理论上我需要一个“Where”参数来检查某个 ID
是否有一些简单的方法(比建立自己的查询更容易),如何包含 SQLiteDatabase.insertWithOnConflict(); 从 v7 开始在 Android API 中? 据我所知,这是从
我有一个 SQLite 表: CREATE TABLE regions (_id INTEGER PRIMARY KEY, name TEXT, UNIQUE(name)); 还有一些安卓代码: Va
在我的sqlite数据库中,我在应用程序中使用了insertWithOnConflict方法来忽略我的sqlite数据库inn android应用程序中的重复数据条目。但我不知道它在我的代码中不起作用
问题背景:我有两个表,其中主键是文本字段。 当我对相同的数据重复使用 SQLiteDatabase.insertWithOnConflict(myTable, null, myValues, SQLi
我是一名优秀的程序员,十分优秀!