2016-10-21 3 views
0

Я пишу Windows 10 Universal App (UWP). Простая функциональность. У меня локальный локальный файл базы данных SQLite (.db) уже заполнен реестрами. Поэтому я в основном просто читаю и показываю информацию. Файл данных имеет несколько таблиц и таблиц соединений, а записей не так много, всего 112 строк с шестью столбцами. Это мой DataBaseConnector класс:UWP SQLite-PCL получить запросы работают очень медленно

class DataBaseConnector 
{ 
    public const string dbName = "HeroData.db"; 
    /*   connection element for SQLite universal platform   */ 
    //private static string dbFilePath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "HeroData.db"); 
    Func<SQLiteConnectionWithLock> connectionFactory = 
      new Func<SQLiteConnectionWithLock>(
       () => 
       new SQLiteConnectionWithLock(
        new SQLitePlatformWinRT(), 
    new SQLiteConnectionString(dbName, storeDateTimeAsTicks: false))); 


    private static DataBaseConnector db = new DataBaseConnector(); 

    private SQLiteAsyncConnection GetDbConnectionAsync() 
    { 
     var asyncConnection = new SQLiteAsyncConnection(connectionFactory); 

     return asyncConnection; 
    } 

    public static DataBaseConnector dbInstance 
    { 
     get { 
      if (db == null) 
      { 
       db = new DataBaseConnector(); 
      } 
      return db; 
     } 
    } 

    public static List<Hero> AllHeroesList = new List<Hero>(); 

    public DataBaseConnector() 
    { 

    } 

    //Get All Heroes From DataBase 
    public async Task<List<Hero>> getAllHeroes() 
    { 
     if (AllHeroesList.Count == 0) { 
     //< get records > 
     string query = @"SELECT hero.id, hero.name, hero.attack_id, hero.attribute_id, hero.role_id, attack.type AS type_name, attribute.name AS attribute_name FROM 
         Heroes hero, AttackType attack, Attribute attribute Where hero.attack_id = attack.id AND 
         hero.attribute_id = attribute.id"; 

     var connection = this.GetDbConnectionAsync(); 

     AllHeroesList = await connection.QueryAsync<Hero>(query); 
     } 
     return AllHeroesList; 
    } 

Когда я запускаю это его работает нормально, но немного медленно, тыс метод AllHeroesList(); занял около 1400 мс на локальном компьютере (рабочий стол) и ~ 300-400 мс на телефонном устройстве (Lumia 930 - Windows Mobile 10). Я не знаю, почему существует такая разница в производительности. У меня больше методов Get, каждый из них получает информацию из базы данных слишком медленно. Когда я должен использовать 3 или более метода на одном и том же XAML Page 3x ~ 1400ms более 4 секунд, чтобы показать содержимое на локальной машине, на телефонном устройстве происходит довольно быстрое ~ 1 сек. Я хочу увеличить производительность.

Это, как я использую методы SQL в приложении страницах:

EnableProgressRing(); 

     if (ct != null && ct.Token.CanBeCanceled) 
     { 
      ct.Cancel(); 
     } 

     ct = new CancellationTokenSource(); 

     heroRoles.Text = await Task.Run(() => GetHeroRoles(ChosenHero.id), ct.Token); 

     IsWeakList.ItemsSource = await Task.Run(() => DataBaseConnector.dbInstance.GetWeakAgainst(heroID), ct.Token); 

     IsStrongList.ItemsSource = await Task.Run(() => DataBaseConnector.dbInstance.GetStrongAgainst(heroID), ct.Token); 

     DisableProgressRing(); 

Я буду признателен, если кто-то может помочь мне с этой проблемой. Спасибо.

ответ

0

Не уверен, что это фактическая причина вашей проблемы, но вы создаете новый SQLiteAsyncConnection с новым SQLiteConnectionWithLock с каждым запросом. Похоже на отходы. Попробуйте создать его только один раз.

+0

Я пробовал, но результат все тот же. Нет улучшения производительности. :( –