联系人在数据库中多次保存

Contacts are saved multiple times in Database

大家好,我有将数据添加到数据库的代码,该代码在 oncreate 上调用。但每次创建片段时,它都会一次又一次地将数据保存到数据库中。我不想要那个。我怎样才能防止这是我获取数据并将其保存到数据库的代码。

public void getcontacts(){
    Cursor phones;
    phones = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
    while (phones.moveToNext()){
        String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        DataBaseOperations hell = new DataBaseOperations(getActivity());
        SQLiteDatabase db = hell.getWritableDatabase();
        hell.SaveContacts(name, phoneNumber, db);
    }
    phones.close();
}

这里是保存在数据库中的代码。

public void SaveContacts(String Name,String phone,SQLiteDatabase db ){
    ContentValues sv = new ContentValues();
    sv.put(mDatabase.Tableinfo.Contacts_name, Name);
    sv.put(mDatabase.Tableinfo.Contacts_phone, phone);
    db.insert(mDatabase.Tableinfo.contacts, null, sv);
}

编辑-这是我到目前为止所做的,但我如何设置约束,它将 conflict.I 添加一个自动递增主键作为唯一键,但它们将如何冲突?但它仍然在 database.where 中再次保存值 我是否将主键设置为约束?????

       public void SaveContacts(String Name,String phone,SQLiteDatabase db ){
    ContentValues sv = new ContentValues();
    sv.put(mDatabase.Tableinfo.Contacts_name, Name);
    sv.put(mDatabase.Tableinfo.Contacts_phone, phone);
    db.insertWithOnConflict(mDatabase.Tableinfo.contacts, null, sv, SQLiteDatabase.CONFLICT_REPLACE);      

编辑- 2 - 我如何在这种查询中创建唯一列???

    private static final String Contacts_Table = "CREATE TABLE "+
        mDatabase.Tableinfo.contacts +"("
       +mDatabase.Tableinfo.Contacts_name+" TEXT,"
        +mDatabase.Tableinfo.Contacts_phone+" TEXT NOT NULL UNIQUE,"
        +mDatabase.Tableinfo.isChattris+" TEXT,"
        +mDatabase.Tableinfo.status_contact+" TEXT,"
        +mDatabase.Tableinfo.Contact_pic+" BLOB"+")";

刚刚添加了 NOT NULL UNIQUE。 这是约束。

  1. 将联系人的状态保存在无关的存储中,例如SharedPreferences。您不想依赖任何生命周期触发器,甚至 Application.onCreate,因为当应用程序启动时,它会一次又一次地发生。
  2. 尝试更新现有条目而不是添加新条目。确定数据库键应该是什么,然后您可以使用 insertWithOnConflict with the CONFLICT_REPLACE 标志插入(如果尚未在 table 中)或更新(如果已存在)。

编辑:要定义约束以触发冲突行为,请更改您的 CREATE TABLE 语句。例如,这将导致重复的 (name,phone) 对触发它。不过,您可能需要使用某种联系 ID。

CREATE TABLE mytable (
  name TEXT,
  phone TEXT,
  UNIQUE(name, phone)
)