如何比较ArrayList和SQLite表行?

时间:2014-12-06 16:33:17

标签: java android sqlite arraylist

假设我有一个名为“table”的sqlite表,其行为id,text1,text2

现在我有一个包含内容的ArrayList,比方说:

  • id:0,text1:这是第一个文本,text2:这是第二个文本
  • id:21,text1:blabla,text2:blabla2 ......

现在我想在sqlite行和arraylist中的每个元素行之间进行比较。 例如,我想说删除sqlite表中的每一行都与arraylist中的任何行不相等。

我找不到包含我的问题的任何平等线程..也许你可以帮助我或给我一些链接。谢谢你

1 个答案:

答案 0 :(得分:2)

这里有一些示例代码。你应该明白这个想法:

    public void removeRows(DatabaseAdapter dbAdapter, ArrayList<SomeObject> list) {
                SQLiteDatabase db = dbAdapter.openWritableDatabase();
                Cursor rows = db.query(/ *perform some query on SQLite db*/);
                while(rows.moveToNext()) {
                    int id = rows.getInt(0);
                    String text1 = rows.getString(1);
                    String text2 = rows.getString(2);
                    boolean included = false;
                    for(SomeObject obj : list) {
                        if(obj.getId() == id && obj.getText1().equals(text1) && obj.getText2().equals(text2)) {
                            included = true;
                            break;
                        }
                    }
                    if(!included) {
                        db.delete(/*perform deletion of row*/);
                    }
                }
     }

编辑:要向列表添加那些尚未包含的对象,请执行以下操作:

    public void addListToDb(DatabaseAdapter dbAdapter, ArrayList<SomeObject> list) {
        SQLiteDatabase db = dbAdapter.openWritableDatabase(); 
        Cursor rows = db.query(/ *perform some query on SQLite db*/);
        for(SomeObject obj : list) {
            boolean included = false;
            while(rows.moveToNext()) {
                int id = rows.getInt(0);
                String text1 = rows.getString(1);
                String text2 = rows.getString(2);
                if(obj.getId() == id && obj.getText1().equals(text1) && obj.getText2().equals(text2)) {
                    included = true;
                    break;
                }
            }
            rows.moveToPosition(-1);
            if(!included) {
                db.insert(/*perform insert of object*/);
            }
        }
    }

还有另一种方法可以完成这项任务。循环遍历列表的元素,并使用SQLiteDatabase#insertWithOnConflict(String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm)方法将每个元素添加到数据库,并将SQLiteDatabase.CONFLICT_IGNORE作为conflictAlgorithm传递。如果数据库中尚不存在元素,则上面的方法将添加元素。否则它会忽略它。需要记住的重要一点是,当我们尝试使用CONFLICT_IGNORE冲突算法插入已存在于数据库中的行时,我们将得到-1结果而不是现有行的主键(Android文档在这里会产生误导)。