나는이 다음과 같은 호출 (이것보다 실제로는 몇 가지 더 - 그것은 여기에 질문의 전체 방법입니다) :Monotouch data sync - 내 코드가 때때로 sqlite 오류를 일으키는 이유는 무엇입니까?
ThreadPool.QueueUserWorkItem(Database.Instance.RefreshEventData);
ThreadPool.QueueUserWorkItem(Database.Instance.RefreshLocationData);
ThreadPool.QueueUserWorkItem(Database.Instance.RefreshActData);
1 점 - 그것은이 같은 WCF 서비스를 호출 메소드를 호출 OK인가? 나는 데이지 체이닝을 시도했는데 엉망이었다.
위 호출되는 새로 고침 방법 중 하나의 예는 (그들은 모두 그냥 다른 테이블을 다른 서비스를 호출하고 채우는, 같은 패턴을 따른다)입니다 :
public void RefreshEventData (object state)
{
Console.WriteLine ("in RefreshEventData");
var eservices = new AppServicesClient (new BasicHttpBinding(), new EndpointAddress (this.ServciceUrl));
//default the delta to an old date so that if this is first run we get everything
var eventsLastUpdated = DateTime.Now.AddDays (-100);
try {
eventsLastUpdated = (from s in GuideStar.Data.Database.Main.Table<GuideStar.Data.Event>()
orderby s.DateUpdated descending
select s).ToList().FirstOrDefault().DateUpdated;
} catch (Exception ex1) {
Console.WriteLine (ex1.Message);
}
try {
eservices.GetAuthorisedEventsWithExtendedDataAsync (this.User.Id, this.User.Password, eventsLastUpdated);
} catch (Exception ex) {
Console.WriteLine ("error updating events: " + ex.Message);
}
eservices.GetAuthorisedEventsWithExtendedDataCompleted += delegate(object sender, GetAuthorisedEventsWithExtendedDataCompletedEventArgs e) {
try {
List<Event> newEvents = e.Result.ToList();
GuideStar.Data.Database.Main.EventsAdded = e.Result.Count();
lock (GuideStar.Data.Database.Main) {
GuideStar.Data.Database.Main.Execute ("BEGIN");
foreach (var s in newEvents) {
GuideStar.Data.Database.Main.InsertOrUpdateEvent (new GuideStar.Data.Event {
Name = s.Name,
DateAdded = s.DateAdded,
DateUpdated = s.DateUpdated,
Deleted = s.Deleted,
StartDate = s.StartDate,
Id = s.Id,
Lat = s.Lat,
Long = s.Long
});
}
GuideStar.Data.Database.Main.Execute ("COMMIT");
LocationsCount = 0;
}
} catch (Exception ex) {
Console.WriteLine("error InsertOrUpdateEvent " + ex.Message);
} finally {
OnDatabaseUpdateStepCompleted (EventArgs.Empty);
}
};
}
이 OnDatabaseUpdateStepCompleted -이 때 그냥 updateComplete 카운터를 반복 할 불렀고 모든 서비스가 다시 돌아 왔음을 알았을 때 대기중인 스피너가 제거되고 앱이 계속 실행됩니다.
이 확인 1 시간 '라운드 작동 -하지만 때로는 이들 중 하나하지 않습니다 :
http://monobin.com/__m6c83107d 내가 첫번째 질문은 생각 -이 모든 OK인가? 나는 쓰레딩과 자물쇠를 사용하는 데 익숙하지 않아서 나를 위해 새로운 길로 방황하고있다. 이 같은 QueueUserWorkItem 사용하고 계십니까? 벌크 삽입/업데이트를 수행하기 전에 잠금을 사용해야합니까? 예를 들면 다음과 같습니다.
public void InsertOrUpdateEvent(Event festival){
try {
if (!festival.Deleted) {
Main.Insert(festival, "OR REPLACE");
}else{
Main.Delete<Event>(festival);
}
} catch (Exception ex) {
Console.WriteLine("InsertOrUpdateEvent failed: " + ex.Message);
}
}
다음 질문은 -이 sqlite 문제의 원인은 무엇입니까?
와트 : //
여기 믹스에 몇 가지 아이디어를 던져 - 난 그냥 새로운 데이터를 가져 오는 '복원'사용 후, 서버에 SQLite는 DB를 생성하여 다운로드에 대해 생각하고 있어요. 확실히 서투른. 아마 아주 무거웠지만 최소한 그것은 매번 일할 것이다! 기록을 위해,이 갱신은 항상 편도이다. 서버 -> 아이폰 – iwayneo
그게 효과가있을 수 있습니다. SQL Server -> SQL CE (이전 하나) 복제 시나리오에서도 동일한 작업을 수행했습니다. 마스터 -> 400 슬레이브 (SQL Server에서)로 끝난 다음 SQL Server (400DB 중 하나)에서 SQL ce (장치)로 1 : 1 마스터 -> 슬레이브로 끝납니다. 괜찮 았지만 실제로는 좋은 해결책이 아니 었습니다.위쪽면에서 압축하고 일반적으로 DB를 압축 할 수 있으며 전화 논리를 훨씬 복잡하게 만들 수 있습니다 .... –
cvista, Syncing 목표를 달성 했습니까? 당신은 당신의 지식의 일부 또는 전부를 기꺼이 공유 할 의향이 있습니까? 휠체어를 다시 만들 필요가 없다면 비슷한 문제를 겪고 있습니다. 감사합니다. 릭 – Rick