Windows phone 7 本地和远程保存数据(同步)

Windows phone 7 本地和远程保存数据(同步),windows-phone-7,Windows Phone 7,输入数据后,最终需要将其远程保存在服务器上。如果当时没有数据连接,我也希望应用程序能正常工作,所以我也需要在手机上本地保存所有内容。然后,应用程序可以在连接到服务器时与服务器同步 这带来了一个小问题。我习惯于在服务器上保存所有内容,然后用服务器为它们生成的id取回记录。如果没有连接,应用程序将本地保存到手机,但不会保存到服务器。当与服务器同步时,我看不到一种方法可以让手机知道记录何时返回,它与哪个本地记录关联。没有足够的唯一数据来解决这个问题 处理这个问题的最佳方法是什么 我一直在考虑的一种方法

输入数据后,最终需要将其远程保存在服务器上。如果当时没有数据连接,我也希望应用程序能正常工作,所以我也需要在手机上本地保存所有内容。然后,应用程序可以在连接到服务器时与服务器同步

这带来了一个小问题。我习惯于在服务器上保存所有内容,然后用服务器为它们生成的id取回记录。如果没有连接,应用程序将本地保存到手机,但不会保存到服务器。当与服务器同步时,我看不到一种方法可以让手机知道记录何时返回,它与哪个本地记录关联。没有足够的唯一数据来解决这个问题

处理这个问题的最佳方法是什么

我一直在考虑的一种方法是将记录的id更改为GUID,并让手机设置id。这样,所有记录都将在本地具有id,并且在保存到服务器时,它仍然应该是唯一的id

我想知道其他人都在做什么,根据经验,哪些有效,哪些无效。

警告-我没有在windows phone开发中尝试过这一点,但在遇到类似情况时,我通常会使用GUID标识-例如,在我只有与数据库的单向连接时创建记录-例如通过消息总线或队列


它工作得很好,尽管在记录大小方面有轻微的损失,而且也可能导致性能较低的索引。我建议你试一试。

这就是我们在几天前与我的朋友完成的第一个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;
}