【问题标题】:How to compare ArrayList with SQLite Table Row?如何比较 ArrayList 和 SQLite 表行?
【发布时间】:2014-12-06 16:33:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java android sqlite arraylist


    【解决方案1】:

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

    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 作为冲突算法传递。如果数据库中尚不存在元素,上述方法将添加元素。否则它会忽略它。要记住的重要一点是,当我们尝试使用 CONFLICT_IGNORE 冲突算法插入数据库中已经存在的行时,我们将得到 -1 结果而不是现有行的主键(Android 文档在此处具有误导性)。

    【讨论】:

    • 谢谢我的朋友..我会试试的
    • 是的,它有效.. 我怎么看如果任何列表数组已经在 sqlite.. 如果没有,则将数组添加到 sqlite
    • 我将编辑答案以向您展示方法,但实际上主要思想非常相似。
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 2017-01-24
    • 2012-01-25
    • 2015-06-02
    • 2012-03-01
    • 2018-08-30
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多