Windows phone 7 本地和远程保存数据(同步)
输入数据后,最终需要将其远程保存在服务器上。如果当时没有数据连接,我也希望应用程序能正常工作,所以我也需要在手机上本地保存所有内容。然后,应用程序可以在连接到服务器时与服务器同步 这带来了一个小问题。我习惯于在服务器上保存所有内容,然后用服务器为它们生成的id取回记录。如果没有连接,应用程序将本地保存到手机,但不会保存到服务器。当与服务器同步时,我看不到一种方法可以让手机知道记录何时返回,它与哪个本地记录关联。没有足够的唯一数据来解决这个问题 处理这个问题的最佳方法是什么 我一直在考虑的一种方法是将记录的id更改为GUID,并让手机设置id。这样,所有记录都将在本地具有id,并且在保存到服务器时,它仍然应该是唯一的id 我想知道其他人都在做什么,根据经验,哪些有效,哪些无效。警告-我没有在windows phone开发中尝试过这一点,但在遇到类似情况时,我通常会使用GUID标识-例如,在我只有与数据库的单向连接时创建记录-例如通过消息总线或队列Windows phone 7 本地和远程保存数据(同步),windows-phone-7,Windows Phone 7,输入数据后,最终需要将其远程保存在服务器上。如果当时没有数据连接,我也希望应用程序能正常工作,所以我也需要在手机上本地保存所有内容。然后,应用程序可以在连接到服务器时与服务器同步 这带来了一个小问题。我习惯于在服务器上保存所有内容,然后用服务器为它们生成的id取回记录。如果没有连接,应用程序将本地保存到手机,但不会保存到服务器。当与服务器同步时,我看不到一种方法可以让手机知道记录何时返回,它与哪个本地记录关联。没有足够的唯一数据来解决这个问题 处理这个问题的最佳方法是什么 我一直在考虑的一种方法
它工作得很好,尽管在记录大小方面有轻微的损失,而且也可能导致性能较低的索引。我建议你试一试。这就是我们在几天前与我的朋友完成的第一个windows phone 7应用程序中所做的。 它可能不是最好的解决方案,但“在进行额外的重构之前,它可以正常工作。”。 它是一个web应用程序的应用程序,比如mint.com 若我们有像保存事务这样的功能,我们首先检查是否连接到internet
// Check if application is in online or in offline mode
if (NetworkDetector.IsOnline)
{
// Save through REST API
_transactionBl.AddTransaction(_currentTransaction);
}
else
{
// Save to phone database
SaveTransactionToPhone(_currentTransaction);
}
若通过REST成功保存了事务,它将使用事务对象进行响应,然后我们将其保存到本地数据库。如果REST保存失败,我们将数据保存到本地数据库
private void OnTransactionSaveCompleted(bool isSuccessful, string message, Transaction savedTransaction)
{
MessageBox.Show(message);
if(isSuccessful)
{
// save new transaction to local database
DatabaseBl.Save(savedTransaction);
// save to observable collection Transactions in MainViewModel
App.ViewModel.Transactions.Add(App.ViewModel.TransactionToTransactionViewModel(savedTransaction));
App.ViewModel.SortTransactionList();
// Go back to Transaction List
NavigationService.GoBack();
}
else
{
// if REST is failed save unsent transaction to Phone database
SaveTransactionToPhone(_currentTransaction);
// save to observable collection Transactions in MainViewModel
App.ViewModel.Transactions.Add(App.ViewModel.TransactionToTransactionViewModel(_currentTransaction));
App.ViewModel.SortTransactionList();
}
}
每个事务对象都有IsInSync属性。默认情况下,它被设置为false,直到我们从restapi获得在服务器上成功保存的确认
用户可以刷新事务。用户可以单击刷新按钮从服务器获取新数据。我们在后台进行同步,如下所示:
private void RefreshTransactions(object sender, RoutedEventArgs e)
{
if (NetworkDetector.IsOnline)
{
var notSyncTransactions = DatabaseBl.GetData<Transaction>().Where(x => x.IsInSync == false).ToList();
if(notSyncTransactions.Count > 0)
{
// we must Sync all transactions
_isAllInSync = true;
_transactionSyncCount = notSyncTransactions.Count;
_transactionBl.AddTransactionCompleted += OnSyncTransactionCompleted;
if (_progress == null)
{
_progress = new ProgressIndicator();
}
foreach (var notSyncTransaction in notSyncTransactions)
{
_transactionBl.AddTransaction(notSyncTransaction);
}
_progress.Show();
}
else
{
// just refresh transactions
DoTransactionRefresh();
}
}
else
{
MessageBox.Show(ApplicationStrings.NETWORK_OFFLINE);
}
}
private void DoTransactionRefresh()
{
if (_progress == null)
{
_progress = new ProgressIndicator();
}
// after all data is sent do full reload
App.ViewModel.LoadMore = true;
App.ViewModel.ShowButton = false;
ApplicationBl<Transaction>.GetDataLoadingCompleted += OnTransactionsRefreshCompleted;
ApplicationBl<Transaction>.GetData(0, 10);
_progress.Show();
}
private void refresh事务(对象发送方,RoutedEventArgs e)
{
if(NetworkDetector.IsOnline)
{
var notSyncTransactions=DatabaseBl.GetData().Where(x=>x.IsInSync==false).ToList();
如果(notSyncTransactions.Count>0)
{
//我们必须同步所有事务
_isAllInSync=true;
_transactionSyncCount=notSyncTransactions.Count;
_transactionBl.AddTransactionCompleted+=OnSyncTransactionCompleted;
如果(_progress==null)
{
_进度=新的ProgressIndicator();
}
foreach(notSyncTransactions中的var notSyncTransaction)
{
_transactionBl.AddTransaction(notSyncTransaction);
}
_progress.Show();
}
其他的
{
//只需刷新事务即可
DoTransactionRefresh();
}
}
其他的
{
MessageBox.Show(ApplicationStrings.NETWORK\u脱机);
}
}
私有void DoTransactionRefresh()
{
如果(_progress==null)
{
_进度=新的ProgressIndicator();
}
//发送所有数据后,执行完全重新加载
App.ViewModel.LoadMore=true;
App.ViewModel.ShowButton=false;
ApplicationBl.GetDataLoadingCompleted+=OnTransactionsRefreshCompleted;
ApplicationBl.GetData(0,10);
_progress.Show();
}
OnTransactionRefreshCompleted我们删除本地数据库中的所有事务数据,并获取最新的10个事务。我们不需要所有的数据,这样用户就可以同步数据了。他总是可以通过在事务列表末尾录制load more来加载更多数据。这与那些推特应用程序类似
private void OnTransactionsRefreshCompleted(object entities)
{
if (entities is IList<Transaction>)
{
// save transactions
var transactions = (IList<Transaction>)entities;
DatabaseBl.TruncateTable<Transaction>();
DatabaseBl.Save(transactions);
((MainViewModel) DataContext).Transactions.Clear();
//reset offset
_offset = 1;
//update list with new transactions
App.ViewModel.LoadDataForTransactions(transactions);
App.ViewModel.LoadMore = false;
App.ViewModel.ShowButton = true;
}
if (entities == null)
{
App.ViewModel.ShowButton = false;
App.ViewModel.LoadMore = false;
}
// hide progress
_progress.Hide();
// remove event handler
ApplicationBl<Transaction>.GetDataLoadingCompleted -= OnTransactionsRefreshCompleted;
}
private void OnTransactionsRefreshCompleted(对象实体)
{
if(实体为IList)
{
//保存事务
var交易=(IList)实体;
DatabaseBl.truncatable();
数据库保存(事务);
((MainViewModel)DataContext).Transactions.Clear();
//重置偏移量
_偏移量=1;
//使用新事务更新列表
App.ViewModel.LoadDataForTransactions(事务);
App.ViewModel.LoadMore=false;
App.ViewModel.ShowButton=true;
}
如果(实体==null)
{
App.ViewModel.ShowButton=false;
App.ViewModel.LoadMore=false;
}
//隐藏进度
_progress.Hide();
//删除事件处理程序
ApplicationBl.GetDataLoadingCompleted-=OnTransactionsRefreshCompleted;
}