java - 如何比较ArrayList和SQLite表行?

标签 java android sqlite arraylist

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

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

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

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

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

最佳答案

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

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 文档在这里有误导性)。

关于java - 如何比较ArrayList和SQLite表行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27333797/

相关文章:

android - 是否可以创建一个使用特定于 API 的 XML 标签的自定义类?

android - 从服务器加载数据的最佳实践(Android App)

java - 如何检查列表中的所有项目是否包含字符串中的任何字符

c# - Java 中可以通过引用传递参数吗?

java - Android - 如何使用 Android 4.0 下载 XML 文件?

android - 原因 : newPosition < 0: (-1 < 0) in Android Studio

json - 如何使用python3解析嵌套的json数据文件并将其插入sqlite数据库

java - 如何创建 SQLiteDatabase 并使用它来填充微调器?

java - BouncyCaSTLe 签名值与 dotNET 签名值不匹配

java - 为什么用 main() 和输出而不是 JUnit 测试来编写示例代码