Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有SQLite Db的Windows Phone 8.1(RT)应用程序,包含67k元素。工作缓慢_C#_Sqlite_Windows Phone 8.1_Windows Store Apps - Fatal编程技术网

C# 带有SQLite Db的Windows Phone 8.1(RT)应用程序,包含67k元素。工作缓慢

C# 带有SQLite Db的Windows Phone 8.1(RT)应用程序,包含67k元素。工作缓慢,c#,sqlite,windows-phone-8.1,windows-store-apps,C#,Sqlite,Windows Phone 8.1,Windows Store Apps,我为“WindowsPhone8.1”开发了一个应用程序,在那里我正在使用一个包含4700个项目的数据库。在“Windows应用商店应用程序8.1/10(桌面/平板电脑)”上,应用程序运行速度很快,但“Windows Phone 8.1”可以看出“UI”运行缓慢且滞后。这里是对性能分析器的分析 当应用程序启动方法“OnLaunching”时,我将数据从sqlite存储库加载到静态类中的静态属性“IEnumerable” await Task.Run(async () => {

我为“WindowsPhone8.1”开发了一个应用程序,在那里我正在使用一个包含4700个项目的数据库。在“Windows应用商店应用程序8.1/10(桌面/平板电脑)”上,应用程序运行速度很快,但“Windows Phone 8.1”可以看出“UI”运行缓慢且滞后。这里是对性能分析器的分析

当应用程序启动方法“OnLaunching”时,我将数据从sqlite存储库加载到静态类中的静态属性“IEnumerable”

await Task.Run(async () =>
    {
        if (InstanceMessageService.AllHolidays == null)
            {
                InstanceMessageService.AllHolidays = _repository.GetAll();
                InstanceMessageService.AllCountries = await Task.Run(() =>
                    InstanceMessageService.AllHolidays.GroupBy(holiday => holiday.Country)
                        .Select(x => x.First().Country)
                        .Select(s => new Country()
                        {
                            Title = s,
                            FirstLetter = s[0].ToString()
                        }).ToList()
                    );

                    if (!InstanceMessageService.AllHolidays.Any() || !InstanceMessageService.AllCountries.Any())
                    {
                        throw new Exception("Cannot load SQLite data"); 
                    }
                }
            });
这里是InstanceMessageService

public static class InstanceMessageService
{
    public static IEnumerable<Holiday> AllHolidays { get; set; } 
    public static IEnumerable<Country> AllCountries { get; set; }
    ...
}
公共静态类InstanceMessageService
{
公共静态IEnumerable AllHolidays{get;set;}
公共静态IEnumerable AllCountries{get;set;}
...
}
现在4700个假日项目包含在静态属性(内存中)中,还有171个国家/地区项目。我认为这不是个好办法

这是CalendarsPage的ViewModel代码。CalendarsPage提供今天、明天或从calendar控件中选择的具体日期的假日数据

public class CalendarPageViewModel : INotifyPropertyChanged
    
        public IEnumerable<Holiday> Holidays
        {
            get { return _holidays; }
            set
            {
                _holidays = value;
                OnPropertyChanged("Holidays");
            }
        }

        public ObservableCollection<Holiday> TodayHolidays
        {
            get { return _todayHolidays; }
            set
            {
                _todayHolidays = value;
                OnPropertyChanged("TodayHolidays");
            }
        }

        public ObservableCollection<Holiday> TomorrowHolidays
        {
            get { return _tomorrowHolidays; }
            set
            {
                _tomorrowHolidays = value;
                OnPropertyChanged("TomorrowHolidays");
            }
        }

        public ObservableCollection<Holiday> SelectedDateHoliday
        {
            get { return _selectedDateHoliday; }
            set
            {
                _selectedDateHoliday = value;
                OnPropertyChanged("SelectedDateHoliday");
            }
        }

        public CalendarPageViewModel()
        {
            Task task = InitCollections();
            InitCommands();
        }
     
       **// Slowly magic here**

        private async Task InitCollections()
        {
            Holidays = InstanceMessageService.AllHolidays;
            TomorrowHolidays = new ObservableCollection<Holiday>(await Task.Run(() => Holidays.Where(holiday => holiday.Date == DateTime.Now.AddDays(1).Date.ToString("MMM d")).Select(holiday => holiday)));
            TodayHolidays = new ObservableCollection<Holiday>(await Task.Run(() => Holidays.Where(holiday => holiday.Date == DateTime.Now.Date.ToString("MMM d")).Select(holiday => holiday)));
        }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
公共类CalendarPageViewModel:INotifyPropertyChanged
公众假期
{
获取{return\u假日;}
设置
{
_假期=价值;
不动产变更(“节假日”);
}
}
今日公众假期
{
获取{return\uTodayHolidays;}
设置
{
_今天的假期=价值;
房地产变更(“今日假期”);
}
}
明日全日公众可观察到的收集
{
获取{return}
设置
{
_明天=价值;
房地产变更(“明天”);
}
}
公众可观察收集选定日期假日
{
获取{return\u selectedDateHoliday;}
设置
{
_selectedDateHoliday=值;
酒店变更(“选定日期假日”);
}
}
公共日历页面视图模型()
{
Task Task=InitCollections();
InitCommands();
}
**//慢慢变魔术**
专用异步任务InitCollections()
{
假日=InstanceMessageService.AllHolidays;
TomorrowHolidays=newobserveCollection(wait Task.Run(()=>Holidays.Where(holiday=>holiday.Date==DateTime.Now.AddDays(1.Date.ToString)(“mmmd”))。选择(holiday=>holiday));
TodayHolidays=newobserveCollection(wait Task.Run(()=>Holidays.Where(holiday=>holiday.Date==DateTime.Now.Date.ToString(“MMM d”))。选择(holiday=>holiday));
}
公共事件属性更改事件处理程序属性更改;
[NotifyPropertyChangedInvocator]
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
如果(PropertyChanged!=null)PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
存储库类代码

public class HolidaysRepository : IRepository<Holiday>
    {
        private readonly IDatabaseConnection _databaseConnection;
        public HolidaysRepository(IDatabaseConnection databaseConnection)
        {
            _databaseConnection = databaseConnection;
        }

        public List<Holiday> GetAll()
        {
            return _databaseConnection.Connection.Table<Holiday>().ToList();
        }

        public void AddOrUpdate(Holiday entity)
        {
            if (_databaseConnection.Connection.Table<Holiday>().FirstOrDefault(item => item.Id == entity.Id) !=
                null)
            {
                Update(entity);
            }
            else
            {
                Add(entity);
            }
        }

        public void Add(Holiday entity)
        {
            _databaseConnection.Connection.Insert(entity);
        }

        public void Update(Holiday entity)
        {
            _databaseConnection.Connection.Update(entity);
        }

        public void Delete(Holiday entity)
        {
            _databaseConnection.Connection.Delete(entity);
        }

        public void Clean()
        {
            _databaseConnection.Connection.DeleteAll<Holiday>();
        }
    }
public class HolidaysRepository:IRepository
{
专用只读IDatabaseConnection\u数据库连接;
公共假期存储(IDatabaseConnection数据库连接)
{
_databaseConnection=数据库连接;
}
公共列表GetAll()
{
返回_databaseConnection.Connection.Table().ToList();
}
公共无效添加或更新(假日实体)
{
if(_databaseConnection.Connection.Table().FirstOrDefault(item=>item.Id==entity.Id)=
空)
{
更新(实体);
}
其他的
{
添加(实体);
}
}
公共作废添加(假日实体)
{
_databaseConnection.Connection.Insert(实体);
}
公共作废更新(假日实体)
{
_databaseConnection.Connection.Update(实体);
}
公共作废删除(假日实体)
{
_databaseConnection.Connection.Delete(实体);
}
公共空间清洁()
{
_databaseConnection.Connection.DeleteAll();
}
}
在应用程序中,我使用“Ninject”作为“ServiceLocator”,这可能很重要


如何提高应用程序的速度?如何减少RAM的使用量?如果4700个元素使应用程序运行缓慢,UI运行缓慢,那么我认为67000个项目将没有足够的RAM。

当加载大量数据需要比您希望的更多的时间时,最简单的解决方案通常是加载更少的数据

您真的需要加载数据库中的所有假日吗?
您能否只加载所需的特定日期?例如,默认情况下,只需加载今天和明天的任何假日,然后查找用户选择的任何特定其他日期

如果您不需要所有假期,但确实必须加载所有国家/地区,那么单独存储这些国家/地区的列表可能比加载所有假期以提取国家/地区要快

在查询数据库中的数据时,应确保具有适当的索引,以便快速查找


可能还需要查看数据上的索引,以便您可以直接从数据库中搜索数据,而不是将其全部加载到一个列表中,然后您可能会进行搜索。

我认为您不希望一次加载所有数据。为什么不加载今天、明天和选定日期的假期呢。或者,如果你的应用程序有月视图,只需加载上个月、本月和下个月的数据。谢谢你的回复。我尝试过这样做,但是UI的速度并没有变快。也许我应该在加载数据时添加动画。也许sqlite可以