Lui*_*ves 59 android android-sqlite
从文档中可以看出,插入或更新的语法是:INSERT OR REPLACE INTO <table> (<columns>) VALUES (<values>),我的问题是有没有合并以下的函数?
public long insert (String table, String nullColumnHack, ContentValues values) 
public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
或者必须使用准备好的SQL语句和rawQuery来完成?
在Android中插入或更新的最佳做法是什么?
the*_*ion 87
我相信您正在询问如何在一个步骤中插入新行或更新现有行.虽然在本答案中讨论的单个原始SQL中可以实现这一点,但我发现在Android中使用SQLiteDatabase.insertWithOnConflict()使用CONFLICT_IGNORE for conflictAlgorithm 在两个步骤中更容易实现.
ContentValues initialValues = new ContentValues();
initialValues.put("_id", 1); // the execution is different if _id is 2
initialValues.put("columnA", "valueNEW");
int id = (int) yourdb.insertWithOnConflict("your_table", null, initialValues, SQLiteDatabase.CONFLICT_IGNORE);
if (id == -1) {
    yourdb.update("your_table", initialValues, "_id=?", new String[] {"1"});  // number 1 is the _id here, update to variable for your code
}
此示例假定表键为"_id"列设置,您知道记录_id,并且已经存在行#1(_id = 1,columnA ="valueA",columnB ="valueB").这是使用insertWithOnConflict与CONFLICT_REPLACE和CONFLICT_IGNORE的区别
当您尝试插入尚未存在的新行#2时,代码将仅在第一个语句insertWithOnConflict中执行SQL INSERT(即,结果将是_id = 2,columnA ="valueNEW",columnB = NULL).
请注意这个导致SQLiteDatabase.CONFLICT_IGNORE在API10(可能是API11)上出现故障的错误.我在Android 2.2上测试时,查询返回0而不是-1.
如果您不知道记录键_id或者您的条件不会产生冲突,则可以将逻辑反转为UPDATE或INSERT.这将在UPDATE期间保留记录键_id或在INSERT期间创建新记录_id.
int u = yourdb.update("yourtable", values, "anotherID=?", new String[]{"x"});
if (u == 0) {
    yourdb.insertWithOnConflict("yourtable", null, values, SQLiteDatabase.CONFLICT_REPLACE);
}
上面的示例假设您只想在记录中更新时间戳值,例如.如果首先调用insertWithOnConflict,则由于时间戳条件的不同,INSERT将创建新记录_id.
kde*_*iry 43
这是您的方法SQLiteDatabase.insertWithOnConflict().要理解它在sqlite 上引用的这个文档
SQLiteDatabase.replace()执行此操作,它基本上调用:
insertWithOnConflict(table, nullColumnHack, initialValues, CONFLICT_REPLACE);
太糟糕了,文档不是很清楚.
该操作的名称为“ upsert”,而我的解决方法是识别表中构成行唯一的列。
示例:_id,姓名,工作,工作时间
我们将使用的列是名称和工作。
private int getID(String name, String job){
    Cursor c = dbr.query(TABLE_NAME,new String[]{"_id"} "name =? AND job=?",new String[]{name,job},null,null,null,null);
    if (c.moveToFirst()) //if the row exist then return the id
        return c.getInt(c.getColumnIndex("_id"));
    return -1;
}
在数据库管理器类中:
public void upsert(String name, String job){
    ContentValues values = new ContentValues();
    values.put("NAME",name);
    values.put("JOB",job);
    int id = getID(name,job);
    if(id==-1)
        db.insert(TABLE_NAME, null, values);
    else
        db.update(TABLE_NAME, values, "_id=?", new String[]{Integer.toString(id)});
}
| 归档时间: | 
 | 
| 查看次数: | 61692 次 | 
| 最近记录: |