我正在将手机的通话记录收集到一张桌子中。
这很有效:
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;");
}
我也试过了,但我得到了
准备时,在0x11a2f0上失败1(接近“SELECT”:语法错误) 'INSERT INTO CallTable VALUES(姓名,电话,类型,持续时间,日期,contactid) SELECT * FROM CallTable WHERE NOT EXISTS(SELECT * FROM CallTable WHERE phone ='30411552'AND date ='1338569074976')LIMIT 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;");
答案 0 :(得分: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失败使它抛出一个错误,你可以捕获而不是默默地跳过插入/更新操作。)
无论你使用insert(),update()还是replace(),这都会使它成功。
答案 1 :(得分:0)
修改强>
我提出的查询不起作用,所以我将其删除了!
更新回答
你应该做什么嗯。提示。在您的数据库中创建一个唯一的列,您可以使用电话+持续时间+日期填充,然后执行
"INSERT OR IGNORE INTO " + DATABASE_TABLE + " values(" + THE_VALUES + ");"
插入新值时,将忽略旧值。
答案 2 :(得分:0)
您还可以创建一个唯一字段,根据包含的日期和电话号码保护生成的代码。由于该字段是唯一的,因此如果代码已存在,则不会添加该字段。
答案 3 :(得分:0)
您也可以尝试updateOrInsert。因此,首先您可以尝试更新数据,如果数据存在,它通常会返回行ID。然后,如果没有从更新返回行id,则可以插入数据。 http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
您看到数据的另一种情况可能是因为您在重建应用程序时没有清除应用程序数据。在您的设备上,转到设置 - >应用程序 - >管理应用程序 - > "你的申请"清晰的数据
答案 4 :(得分:0)
我想我只需要查看电话号码和日期,因为它标识了电话。如果已存在具有该数字且在该日期的记录,则跳转到下一条记录。
进行'插入或替换':
使用字段KEY_PHONE
和KEY_DATE
为表格创建复合主键。
使用replace (..)
上的SQLiteDatabase
方法代替您当前使用的insert (...)
。因此,您的populate_Calls
返回语句应如下所示:
return ourDatabase.replace(DATABASE_TABLE, null, cv);