gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:33:57 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

这就是我们几天前与我的 friend 完成第一个 Windows Phone 7 应用程序的方式。它可能不是最好的解决方案,但在进行额外的重构之前它工作得很好。这是一个名为 slamarica 的网络应用程序的应用程序,如 mint.com .

如果我们有保存交易等功能,我们首先检查我们是否连接到互联网。

        // 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,直到我们从 REST API 确认它已成功保存在服务器上。

用户可以刷新交易。用户可以单击刷新按钮从服务器获取新数据。我们像这样在后台进行同步:

   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();
}

OnTransactionRefreshCompleted 我们删除本地数据库中的所有交易数据并获取最新的 10 笔交易。我们不需要所有数据,这样用户就可以同步数据。他总是可以通过在事务列表末尾点击加载更多来加载更多数据。它类似于那些 Twitter 应用程序。

 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;
}

关于windows-phone-7 - 本地和远程保存数据(同步),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5524007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com