2016-10-18 3 views
0
내가, 내보기 모델에 난 뒤에 내 코드에 내 데이터베이스

자 마린은, SQLite는 함께 문제를 형성하고

private SQLiteAsyncConnection connection; 
    public ObservableCollection<Announcement> AnnouncementList { get; private set; } 

    public AnnouncementsViewModel() { 
     connection = DependencyService.Get<ISQLiteDb>().GetConnection(); 
     Initialize(); 
    }  

    public async void Initialize() { 
     await connection.CreateTableAsync<Announcement>(); 
     var announcements = await connection.Table<Announcement>().ToListAsync(); 
     AnnouncementList = new ObservableCollection<Announcement>(announcements); 
     System.Diagnostics.Debug.WriteLine("***********************************"); 
     System.Diagnostics.Debug.WriteLine(AnnouncementList.Count); 
    } 

에서 발표의 목록을 얻으려고 노력하고있는 SQLite는-NET-PCL nuget을 사용하고

을 기다리고 있습니다 생성자 :

BindingContext = new AnnouncementsViewModel(); 
InitializeComponent(); 
var list = (BindingContext as AnnouncementsViewModel).AnnouncementList; 

내가 오류는 다음과 같습니다

System.NullReferenceException : 개체 참조가 예를로 설정되지 않았습니다개체입니다.

내 viewModel에 중단 점을 넣습니다. 처음 도착하면 코드 숨김으로 돌아가고 App이 충돌합니다. AnnouncementList가 viewModel에 채워지지 않고 별을 인쇄하지 않았기 때문에 null 예외가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까?

감사

+0

예외의 호출 스택은 무엇입니까? –

+0

'(BindingContext as AnnouncementsViewModel)'null '입니다. – Alex

+0

@ j0ey_wh이 줄에 중단 점을 넣습니다. 해결할 수 없습니다. AnnouncementsViewModel – Mireille

답변

0

당신은 그런 동기 방식으로 비동기 Initialize() 방법을 호출 할 수 없습니다. 즉시 돌아오고 AnnouncementList을 사용하기 전까지는 Initialize이 아직 실행되지 않고 여전히 null입니다.

이상적인 솔루션은 아니지만 Initialize() 뒤에 .Wait()을 추가하여 생성자를 종료하기 전에 완료해야합니다.

문맥에 따라 Wait()이 차단 될 수 있으므로 '이상적'이라고 말합니다. 그럴 경우 '적절한'대기 만 사용하고 AnnouncementsList을 생성자에 전달하여 ViewModel을 구성하기 전에 초기화 작업을 수행하는 것이 좋습니다.

+0

초기화 할 수 없으므로 .Wait()가 반환됩니다. void ViewModel을 변경했습니다. – Mireille

+0

해당 특정 문제를 해결하려면 변경하십시오. 태스크에 대한 리턴 유형. – sellotape

+0

실행하면 검은 색 화면 만 나타납니다 – Mireille

0

새로운 뷰 모델 :

뒤에 내 코드에서 다음
public AnnouncementsViewModel() { 
     connection = DependencyService.Get<ISQLiteDb>().GetConnection(); 
    } 
    public async void GetAnnouncement() { 
     await connection.CreateTableAsync<Announcement>(); 
     var announcements = await connection.Table<Announcement>().ToListAsync(); 
     AnnouncementList = new ObservableCollection<Announcement>(announcements);   System.Diagnostics.Debug.WriteLine("***********************************"); 
     System.Diagnostics.Debug.WriteLine(AnnouncementList.Count); 
    } 

:

protected override async void OnAppearing() { 
     (BindingContext as AnnouncementsViewModel).GetAnnouncement(); 
     if ((BindingContext as AnnouncementsViewModel).list != null) 
      classAnnouncementListView.ItemsSource = (BindingContext as AnnouncementsViewModel).list; 
     base.OnAppearing(); 
    } 
+0

답변을 추가하는 대신 질문을 편집하여 추가하십시오. – sellotape

관련 문제