联系人在数据库

时间:2015-12-17 14:08:09

标签: android sqlite android-sqlite

大家好我有代码将数据添加到数据库中,并在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);
}
编辑 - 这是我到目前为止所做的,但我如何设置一个约束,它将冲突。我已经添加了一个自动增量主键作为唯一键,但它们将如何冲突?但仍然是它在database.n中的保存值。我在哪里设置一个素数键作为约束?????

       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);      

EDIT- 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 个答案:

答案 0 :(得分:1)

  1. 保持联系人的状态保存在不相关的存储空间中,例如SharedPreferences。您不想依赖任何生命周期触发器,甚至不依赖于Application.onCreate,因为这会在应用程序启动时反复发生。
  2. 尝试更新现有条目,而不是添加新条目。确定数据库密钥应该是什么,然后您可以使用带有insertWithOnConflict标志的CONFLICT_REPLACE来插入(如果尚未包含在表中)或更新(如果已经存在)。
  3. 编辑:定义约束以便触发冲突行为,更改CREATE TABLE语句。例如,这将导致重复(名称,电话)对触发它。您可能希望使用某种联系人ID。

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