联系人在数据库中多次保存
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。
这是约束。
- 将联系人的状态保存在无关的存储中,例如SharedPreferences。您不想依赖任何生命周期触发器,甚至 Application.onCreate,因为当应用程序启动时,它会一次又一次地发生。
- 尝试更新现有条目而不是添加新条目。确定数据库键应该是什么,然后您可以使用 insertWithOnConflict with the CONFLICT_REPLACE 标志插入(如果尚未在 table 中)或更新(如果已存在)。
编辑:要定义约束以触发冲突行为,请更改您的 CREATE TABLE
语句。例如,这将导致重复的 (name,phone) 对触发它。不过,您可能需要使用某种联系 ID。
CREATE TABLE mytable (
name TEXT,
phone TEXT,
UNIQUE(name, phone)
)
大家好,我有将数据添加到数据库的代码,该代码在 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。 这是约束。
- 将联系人的状态保存在无关的存储中,例如SharedPreferences。您不想依赖任何生命周期触发器,甚至 Application.onCreate,因为当应用程序启动时,它会一次又一次地发生。
- 尝试更新现有条目而不是添加新条目。确定数据库键应该是什么,然后您可以使用 insertWithOnConflict with the CONFLICT_REPLACE 标志插入(如果尚未在 table 中)或更新(如果已存在)。
编辑:要定义约束以触发冲突行为,请更改您的 CREATE TABLE
语句。例如,这将导致重复的 (name,phone) 对触发它。不过,您可能需要使用某种联系 ID。
CREATE TABLE mytable (
name TEXT,
phone TEXT,
UNIQUE(name, phone)
)