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の準備時の0x11a2f0での失敗1(「SELECT」の近く:構文エラー) 'AND date ='1338569074976')LIMIT1;'。

および構文エラー:

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

編集

提案したクエリが機能しないため、削除しました。

更新された回答

あなたは何をすべきか。提案します。dbに一意の列を作成します。この列には、phone + duration + dateのようなものを入力してから、

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

新しい値を挿入すると、古い値は無視されます。

于 2012-06-01T18:07:42.317 に答える
0

一意のフィールドを作成して、含まれている日付と電話番号に基づいて生成されたコードを安全にすることもできます。フィールドは一意であるため、コードがすでに存在する場合は追加されません。

于 2012-06-01T18:12:13.190 に答える
0

updateOrInsertを試すこともできます。したがって、最初にデータの更新を試みることができます。通常、データが存在する場合は行IDが返されます。次に、更新から行IDが返されない場合は、データを挿入できます。 http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

データが表示されるもう1つのシナリオは、アプリケーションを再構築するときにアプリケーションデータをクリアしていないことが原因である可能性があります。デバイスで、[設定]->[アプリケーション]->[アプリケーションの管理]->[アプリケーションのクリアデータ]に移動します

于 2012-06-01T18:12:35.560 に答える
0

電話番号と日付だけを見る必要があると思います。それは電話を識別するからです。その番号とその日付のレコードがすでに存在する場合は、次のレコードにジャンプしてください。

'挿入または置換'を行うには:

  1. フィールドKEY_PHONEと。を使用して、テーブルの複合主キーを作成しますKEY_DATE

  2. 現在使用しているreplace (..)方法のSQLiteDatabase代わりに、の方法を使用しinsert (...)てください。したがって、populate_Callsreturnステートメントは次のようになります。

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

于 2012-06-01T18:19:52.420 に答える