【问题标题】:Contacts are saved multiple times in Database联系人在数据库中多次保存
【发布时间】:2015-12-18 22:01:06
【问题描述】:

大家好,我有将数据添加到数据库的代码,该代码在 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);
}

编辑-这是我到目前为止所做的,但我如何设置它会冲突的约束。我添加了一个自动增量主键作为唯一键,但它们将如何冲突?但它仍然在数据库中再次保存值。我在哪里将初级键设置为约束?????

       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。 这就是约束。

【问题讨论】:

  • 您在ContactsContract.CommonDataKind.* 中有您的联系人数据,那么为什么要在您的私人数据库中复制这些数据呢?
  • @pskink - 好点
  • 我会将这些数据发送到服务器数据库进行检查。它就像 Whatsapp 类型的应用程序。
  • 它没有解释为什么要单独复制您的数据
  • 对不起,如果我无法解释,但我只有这种方法来做我需要的事情。

标签: android sqlite android-sqlite


【解决方案1】:
  1. 将联系人的状态保存在不相关的存储中,例如SharedPreferences。您不想依赖任何生命周期触发器,甚至是 Application.onCreate,因为这会在应用启动时一次又一次地发生。
  2. 尝试更新现有条目而不是添加新条目。确定数据库键应该是什么,然后您可以使用 insertWithOnConflictCONFLICT_REPLACE 标志来插入(如果尚未在表中)或更新。

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

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

【讨论】:

  • 什么定义条目对您来说是独一无二的?为您的表定义一个主键或唯一约束,然后当您插入时,如果其中一个会被插入 sqlite 违反,将删除有问题的行(旧版本)并插入新行。请参阅 sqlite 文档 (sqlite.org/lang_conflict.html) 以及搜索“android sqlite insertWithOnConflict”。
  • 请再次查看我的问题。我已经添加了我理解的内容。
  • 但我的查询与创建表不同。再看我的问题。谢谢
  • 行中的其他数据被删除或重新创建?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多