2

我正在将电话的通话记录收集到表格中。

这很好用:

public long populate_Calls(String name, String phone, String type, String duration, String date, String contactid) {
        ContentValues cv = new ContentValues();
             cv.put(KEY_NAME, name);
             cv.put(KEY_PHONE, phone);
             cv.put(KEY_TYPE, type);
             cv.put(KEY_DURATION, duration);
             cv.put(KEY_DATE, date);
             cv.put(KEY_CONTACTID, contactid);

        return ourDatabase.insert(DATABASE_TABLE, null, cv);        
    }

假设该表包含 455 条记录。现在用户进行了一些调用,并刷新了表格。我只想将新的呼叫数据添加到表中。我一直在尝试使用这段代码(虽然我不太明白)但是每次刷新表格时,都会添加越来越多的记录。在模拟器中它工作正常(我只有 12 个拨出电话)。

我想我只需要查看电话号码和日期,因为它可以识别呼叫。如果具有该编号且在该日期的记录已经存在,则只需跳转到下一条记录。如果不存在,请将其添加到表中。正确的?

    public void populate_Calls2(String name, String phone, String type, String duration, String date, String contactid) {
 ourDatabase.execSQL("INSERT INTO " + DATABASE_TABLE + " (" + KEY_NAME + "," + KEY_PHONE + "," + KEY_TYPE + "," + KEY_DURATION + "," + KEY_DATE + "," + KEY_CONTACTID + ") SELECT * FROM (SELECT '" + name  + "'," + phone + "," + type + "," + duration + "," + date + "," + contactid + ") WHERE NOT EXISTS (SELECT * FROM " + DATABASE_TABLE + " WHERE " + KEY_PHONE + " = '" + phone + "' AND " + KEY_DATE + " = '" + date + "') LIMIT 1;");    

    }

我也试过这个,但我明白了

准备'INSERT INTO CallTable VALUES(name,phone,type,duration,date,contactid) SELECT * FROM CallTable WHERE NOT EXISTS (SELECT * FROM CallTable WHERE phone = '30411552 ' AND 日期 = '1338569074976') 限制 1;'。

和语法错误:

ourDatabase.execSQL("INSERT INTO " + DATABASE_TABLE + " VALUES(" + KEY_NAME + "," + KEY_PHONE + "," + KEY_TYPE + "," + KEY_DURATION + "," + KEY_DATE + "," + KEY_CONTACTID + ") SELECT * FROM " + DATABASE_TABLE + " WHERE NOT EXISTS (SELECT * FROM " + DATABASE_TABLE + " WHERE " + KEY_PHONE + " = '" + phone + "' AND " + KEY_DATE + " = '" + date + "') LIMIT 1;");
4

5 回答 5

6

如果您在创建表时将其设置为为您执行此操作,则无需检查数据库是否存在重复项。

您的表创建字符串可能如下所示:

private static final String CREATE_TABLE = "create table "
        + YOUR_TABLE + " (_id integer primary key autoincrement, "
        + KEY_NAME + " text not null,"
        + KEY_PHONE + " text not null,"
        + KEY_TYPE + " text not null,"
        + KEY_DURATION + " text not null,"
        + KEY_DATE + " text not null,"
        + KEY_CONTACTID + " integer not null,"
        + "UNIQUE(" + KEY_PHONE + "," + KEY_DATE + ") ON CONFLICT IGNORE);";

设置它,以便如果您的电话和日期组合相同,则记录将导致违反约束,并且该记录的插入/更新将被忽略(您可以将最后一位更改为 ON CONFLICT FAIL 以使它会抛出一个您可以捕获的错误,而不是静默地跳过插入/更新操作)。

无论您使用 insert()、update() 还是 replace(),这都会使其工作。

于 2012-06-01T18:25:33.883 回答
0

您还可以创建一个唯一字段,您可以在其中根据包含日期和电话号码保护生成的代码。由于该字段是唯一的,如果代码已经存在则不会添加。

于 2012-06-01T18:12:13.190 回答
0

你也可以试试 updateOrInsert。因此,首先您可以尝试更新数据,如果数据存在,它通常会返回行 ID。如果更新没有返回行 ID,则可以插入数据。 http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

您看到数据的另一种情况可能是因为您在重建应用程序时没有清除应用程序数据。在您的设备上转到设置 -> 应用程序 -> 管理应用程序 -> “您的应用程序”清除数据

于 2012-06-01T18:12:35.560 回答
0

我想我只需要查看电话号码和日期,因为它可以识别呼叫。如果具有该编号且在该日期的记录已经存在,则只需跳转到下一条记录。

要执行“插入或替换”:

  1. KEY_PHONE使用字段和为表创建复合主键KEY_DATE

  2. 使用您当前使用的replace (..)方法SQLiteDatabase而不是insert (...)您当前使用的方法。因此,您的populate_Calls退货声明应如下所示:

    return ourDatabase.replace(DATABASE_TABLE, null, cv);

于 2012-06-01T18:19:52.420 回答
0

编辑

我提出的查询不起作用,所以我删除了它!

更新的答案

你应该做什么嗯。建议。在你的数据库中创建一个独特的列,你用电话+持续时间+日期之类的东西填充它,然后做

"INSERT OR IGNORE INTO " + DATABASE_TABLE + " values(" + THE_VALUES + ");"

插入新值时,旧值将被忽略。

于 2012-06-01T18:07:42.317 回答