【发布时间】:2015-09-01 07:59:46
【问题描述】:
我正在为我的移动应用创建 SQLite 数据库。应用程序数据库将存储存储在 Android 手机中的联系人副本。下面的代码用于从数据库中复制联系人。我的问题是,每次打开 App 时,都会将整个数据复制到 SQLite 数据库中,从而导致大量重复条目。如果我在将记录复制到 SQLite 数据库之前尝试检查条目是否存在,那么每次启动应用程序时,它都会检查重复性导致应用程序过载。
为了解决我想的问题,如果用户添加联系人成功后有任何响应,那么我们可以使用该响应将联系人添加到 SQLite 数据库中,然后我们可以在启动 App 时取出数据库复制。由于我是 Android 世界的新手,因此请您提出解决此问题的最佳方法。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button prd = (Button) findViewById(R.id.duct);
prd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
load_contacts();
display_cotacts();
Log.i("Activity Main", "Completed Displaying List");
}
});
}
private void load_contacts(){
openDB();
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
//String[] from = {ContactsContract.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone_ID};
if(cur.getCount()>0) {
while(cur.moveToNext()){
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString((cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
if(Integer.parseInt(cur.getString(
cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) >0){
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
new String[]{id},null);
while(pCur.moveToNext()){
Integer mobile = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String email = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
Integer imageID = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID));
String status = "available";
String time = "now";
long newId = myDb.insertRow(name,mobile,email,imageID,status,time);
Toast.makeText(MainActivity.this, "Name: " + name + "Phone no:" + mobile + "Email:" + email + "image:" + imageID + "image_thumbnail:" + status, Toast.LENGTH_LONG).show();
}
//closeDB();
pCur.close();
}
}
}
}
【问题讨论】:
-
您不能使用
CONTACT_ID或RAW_CONTACT_ID作为数据库的主键或唯一键约束吗?从而阻止任何重复的插入? -
如果您使用 CursorLoader,它应该在数据更改时收到更新。如果联系人提供程序使用 notifyUri。它可能不会。但是,如果是这样,您可以使用 CursorLoader 加载联系人提供程序并在联系人更改时收到通知(您甚至可以将其放入服务中)。
-
感谢克诺索斯的帮助。是否可以提供几行代码以更好地理解您的上述陈述。提前感谢您的帮助。
-
查看此链接,对我很有用。 stackoverflow.com/questions/19829803/…
标签: android sqlite sql-insert