gpt4 book ai didi

sqlite - 在 xamarin 项目中使用 MobileServiceClient 和 MobileServiceSQLiteStore '数据库被锁定'

转载 作者:行者123 更新时间:2023-12-03 14:58:33 25 4
gpt4 key购买 nike

我对移动和异步数据访问比较陌生,我正在尝试从 VS2017 中的 Xamarin 入门“跨平台”模板构建业务线应用程序。似乎当我过于频繁地执行数据库操作时,我会收到“数据库被锁定”的消息(大多数问题都涉及滚动您自己的 sqlite 实现)。我添加了非常详细的日志记录(我必须支持非技术的最终移动用户)。

我更改为(如其他答案中所建议的)用于数据库访问的单例模型,该模型在调用 table.ReadAsync 时产生不可追踪(意味着没有捕获异常并且没有 xamarin 日志条目)异常(见下文)。

作为第二个问题,在这上面花了这么多时间并遇到了这么多不同的障碍(毫无疑问是我自己造成的),我想知道我是否没有遵循移动开发的一些不成文的规则,例如“只有一个异步对象每页读取并为 100% 异步设计 UI”。我是不是想做得太多?这是我当前的“单例”数据访问类:

public static class MainDataStore
{
private static ReaderWriterLockSlim ReadLock = new ReaderWriterLockSlim();

public static bool IsInitialized { get; set; }
public static MobileServiceClient MobileService { get; set; }
public static bool UseAuthentication = true;
public static IMobileServiceSyncTable<User> UserTable;
public static IMobileServiceSyncTable<Showroom> ShowroomTable;

public static IEnumerable<User> Users { get; set; } //= new ObservableRangeCollection<User>();
public static IEnumerable<Showroom> Showrooms { get; set; }

public static void InitializeAsync()
{
try
{

if (IsInitialized)
return;

Logging.D("Starting to initialize main store.");

AuthenticationHandler handler = null;

handler = new AuthenticationHandler();

MobileService = new MobileServiceClient(App.AzureMobileAppUrl, handler)
{
SerializerSettings = new MobileServiceJsonSerializerSettings
{
CamelCasePropertyNames = true
}
};

var store = new MobileServiceSQLiteStore(Settings.DatabaseName);

store.DefineTable<User>();
store.DefineTable<Showroom>();

MobileService.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());

UserTable = MobileService.GetSyncTable<User>();
ShowroomTable = MobileService.GetSyncTable<Showroom>();

Logging.D("Finished initializing main store.");

IsInitialized = true;
}
catch (Exception ex)
{
Logging.E(ex); // Debug.WriteLine("EXCEPTION: " + ex.Message + ". Stack: " + ex.StackTrace);
}
}

public static async void Load(ECarnavalObjectType type)
{
Logging.D("Reading lock entering. Read count: " + ReadLock.CurrentReadCount.ToString());

// ReadLock.EnterReadLock();

switch (type)
{
case ECarnavalObjectType.Users:
await GetUsersAsync();
Users = await UserTable.ToEnumerableAsync();
break;
case ECarnavalObjectType.Showrooms:
await GetShowroomsAsync();
Showrooms = await ShowroomTable.ToEnumerableAsync();
break;
}

// ReadLock.ExitReadLock();
}
public static async Task GetUsersAsync()
{
if (CrossConnectivity.Current.IsConnected)
{
try
{
// await UserTable.ReadAsync<User>(UserTable.CreateQuery());
await UserTable.PullAsync($"all{typeof(User).Name}", UserTable.CreateQuery());
}
catch (Exception ex)
{

}
}
}
public static async Task GetShowroomsAsync()
{
await ShowroomTable.ReadAsync<Showroom>(ShowroomTable.CreateQuery());
}
}

最佳答案

在您的代码中,您没有等待 InitializeAsync(),这意味着当您去同步它时,数据库可能仍处于锁定状态并正在设置中。
将您的代码安排在一个单例中,然后让每个方法(读取/列表/等)调用 await InitializeAsync()来初始化数据库。早日返回InitializeAsync()方法,如果数据库已经创建(你有一些很好的代码)。
有关更多信息,请参阅我的书:https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter3/client/

关于sqlite - 在 xamarin 项目中使用 MobileServiceClient 和 MobileServiceSQLiteStore '数据库被锁定',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44751639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com