//HE СЛЕДУЕТ использовать вызовы сборщика мусора в готовом программном
//коде. Это ЗАМЕДЛЯЕТ работу приложения.
System.GC.Collect();
const int testNumber = 0;
//Запустить таймер теста
PerformanceSampling.StartSample(testNumber, "Custom Array implementation");
//Запустить тест!
for(int testCount = 0; testCount < NUMBER_TEST_ITERATIONS; testCount++) {
//Передвинуть дату вперед на один день
newDate = newDate.AddDays(1);
int numberRecordsChanged = 0;
//Просмотреть все имена, используя СТРОКИ
numberRecordsChanged = changeDayOfTravel_CustomArrays(TEST_CREDIT_CARD, newDate);
//Убедиться в нормальном выполнении теста...
if (numberRecordsChanged != 1) {
System.Windows.Forms.MessageBox.Show("No matching records found. Test aborted!");
return;
}
}
//Получить время выполнения теста
PerformanceSampling.StopSample(testNumber);
//Обычный курсор
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
//Отобразить результаты теста
string runInfo = NUMBER_TEST_ITERATIONS.ToString() + "x" +
DUMMY_ROWS_OF_DATA.ToString() + ": ";
System.Windows.Forms.MessageBox.Show(runInfo +
PerformanceSampling.GetSampleDurationText(testNumber));
}
private int changeDayOfTravel_CustomArrays(string creditCardNumber, System.DateTime newTravelDate) {
int numberRecordsChanged = 0;
//Просмотреть каждый элемент массива
for (int index = 0; index <= DUMMY_ROWS_OF_DATA; index++) {
string currentCreditCard;
currentCreditCard = m_data_creditCards[index];
//Обновить запись при наличии совпадения
if (creditCardNumber == currentCreditCard) {
//Изменить дату поездки
System.DateTime currentTravelDate = m_data_travelDates[index];
//Увеличить значение счетчика обновлений только при несовпадении данных
if (currentTravelDate != newTravelDate) {
m_data_travelDates[index] = newTravelDate;
numberRecordsChanged++;
}
}
}
//Возвратить количество обновленных записей
return numberRecordsChanged;
}
private void buttonRunTest_Click(object sender, System.EventArgs e) {
createDataSet();
changeDayOfTravel_test();
}
Пример использования базы данных на устройстве и управления пользовательскими данными
Чтобы проиллюстрировать методы представления и управления пользовательскими данными, считанными из базы данных в память, полезно вернуться к примеру из предыдущей главы. В настоящем примере мы вновь рассмотрим словарную игру, для которой разрабатывали пользовательский интерфейс в главе 13.
Ранее нас интересовали вопросы проектирования пользовательского интерфейса для этого мобильного приложения, а теперь мы будем исследовать хранение и представление в памяти самих слов, образующих словарь. Поскольку словарь, который мы хотели бы использовать для данного мобильного приложения, может оказаться очень большим, то, исходя из соображений быстродействия, эффективности и гибкости приложения, для хранения данных желательно использовать базу данных. По своей природе наши данные предназначены в основном только для чтения; время от времени пользователь может добавлять в словарь новые слова, но динамическое обновление существующих данных не является главным требованием. Кроме того, данные имеют простую структуру и их легко можно представить в виде одной таблицы базы данных.
В силу всех вышеуказанных причин — потенциально большое количество записей, низкая частота обновления и простота структуры данных — возможности подхода, основанного на использовании объектов ADO.NET DataSet, намного превышают уровень наших потребностей.
Мы вполне можем обойтись оптимизированным решением, используя низкоуровневые возможности класса SQL СЕ DataReader (System.Data. SqlServerCe.SqlCeDataReader) для выполнения запросов к локальной базе данных SQL СЕ нашего устройства. В результате запросов наше приложение будет получать однонаправленный курсор, указывающий на данные, которые отвечают критерию запроса. Далее эти данные можно загрузить в память и сохранить в пользовательском формате, специально подобранном таким образом, чтобы обеспечить наиболее эффективную работу со словарем. В интересах простоты и быстродействия соответствующие объекты будут размещаться в массивах. Тем самым будет достигнута существенная экономия времени и памяти по сравнению с общим подходом, основанным на использовании объектов DataSet, поскольку мы размещаем в памяти лишь те объекты, которые действительно будут использоваться в нашем приложении.
Следует обратить ваше внимание на два момента, которые используются в нашем примере с целью его упрощения, но вряд ли встретятся вам в реальных приложениях для мобильных устройств:
Читать дальше