我正在构建一个Windows Phone 8应用程序。为此,我需要从People Hub App获取联系人。即使应用程序关闭后,我有什么方法可以保留这些联系人吗?
我已研究过数据缓存,但如果联系人已更新,则缓存将无效。
答案 0 :(得分:0)
这可以做到。 我已使用Group Contacts应用实现了此功能。
在我的解决方案中,我使用SQLite根据用户偏好将联系人存储到各种类别中。
当应用程序启动时,我使用SQLite初始化我的本地数据库并从那里拉取联系人以及检索手机本身的所有联系人。
示例:
await ContactsRepository.Instance.Initialize();
var appContacts = await ContactsRepository.Instance.Get();
var phoneContacts = await ContactServices.Instance.LoadContacts(Contacts, SelectedCategory);
MergeContacts(appContacts, phoneContacts);
。
当应用启动时,如果数据库尚不存在,则需要创建数据库。
示例:
public async Task Initialize()
{
_connection = new SQLiteAsyncConnection(Constants.DATABASE_FILE_NAME);
await EnsureTableExist<ContactReference>(_connection);
}
private async Task EnsureTableExist<T>(SQLiteAsyncConnection connection) where T : new()
{
bool noTableExists = false;
try
{
var query = await connection.Table<T>().FirstOrDefaultAsync();
}
catch (SQLiteException ex)
{
if (ex.Message.Contains("no such table"))
{
noTableExists = true;
}
}
if (noTableExists)
{
await connection.CreateTableAsync<T>();
}
}
Windows 8.1使用ContactManager从人员中心检索联系人。
示例:
public async Task<ObservableCollection<Contact>> LoadContacts(ObservableCollection<Contact> contacts, Category category)
{
contacts.Clear();
try
{
var contactStore = await ContactManager.RequestStoreAsync();
var result = await contactStore.FindContactsAsync();
foreach (var item in result)
{
contacts.Add(item);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
return contacts;
}
然后,我在手机的联系人列表和我应用的联系人列表之间管理我的联系人收藏。
示例:
private void MergeContacts(ObservableCollection<ContactReference> appContacts, ObservableCollection<Contact> phoneContacts)
{
foreach (var contact in phoneContacts)
{
var contactExists = appContacts.Any(c => c.ContactId == contact.Id);
if (!contactExists)
{
OthersCategory.Contacts.Add(contact);
}
Category category = GetCategory(contact);
if (category == null)
{
OthersCategory.Contacts.Add(contact);
}
}
SortContacts(OthersCategory);
}
我创建了一个实体类来支持我的本地数据库操作。
示例:
public class ContactReference
{
[PrimaryKey]
public string ContactId { get; set; }
public string CategoryName { get; set; }
}
注:
VS2013提供的仿真器没有虚构联系人列表。 结果,我发现使用我的个人电话进行调试更容易进行测试。