База данных заблокирована: исключение SQLite возникло в моем приложении android и ios xamarin - PullRequest
0 голосов
/ 17 апреля 2019

База данных была очень стабильной, пока я не выполнил подписывание всех пакетов и пакетов и не развернул приложение в центре приложений для распределенного тестирования, а затем начал получать всевозможные ошибки из базы данных SQLite.Я провел некоторое исследование и узнал, что база данных не является поточно-ориентированной, но как я могу сделать ее поточно-ориентированной, все мои подключения к базе данных и запросы выполняются через асинхронное соединение.
Это мое соединение с базой данных

    private static object collisionLock = new object();
    //local SQLite database.

    public SQLiteAsyncConnection Db;
    private Uri url;
    private MemberDataStore membersStore;
    private AdvantageMemberDataStore advMembersStore;
    private EventDataStore eventDataStore;



    public ConnectionsUtil()
    {
         Db = DependencyService.Get<IDatabaseConnection>().DbConnection();
    }       

Это код, который вставляет и обновляет. У меня есть три метода, таких как приведенный ниже, для доступа к базе данных и множество запросов, использующих БД в приложении

    public async Task GetAdvantageMembersAsync(AdvantageMemberDataStore store)
    {
        await Db.QueryAsync<AdvantageMember>("DROP TABLE IF EXISTS AdvantageMember").ContinueWith(t =>
        {

            Db.CreateTableAsync<AdvantageMember>();

            Console.WriteLine("AdvantageMember table created!");

        });
        url = new Uri("http://54.39.180.209/benefits");

        Console.WriteLine("Gideon: Attempting to get advantage members.");
        try
        {

            string json;
            //Gideon: get json string containing advantage members.
            using (WebClient sr = new WebClient())
            {

                Console.WriteLine("Gideon: Retrieving advantage Members....");

                sr.DownloadStringCompleted += async (s, e) =>
                {

                    Console.WriteLine("Gideon: Advantage Members Downloaded. Processing advantage Members....");
                    json = e.Result;
                    lock (collisionLock)
                    {
                       Db.InsertAllAsync(JsonConvert.DeserializeObject<IEnumerable<AdvantageMember>>(json)).ContinueWith(async t =>
                        {
                            await store.UpdateItemsAsync(Db.QueryAsync<AdvantageMember>("SELECT * FROM AdvantageMember GROUP BY Title").Result);
                        });
                    }

                        Console.WriteLine("Processing Members benefits for android");
                        advMembersStore = store;      
                };

                await Task.Run(() => sr.DownloadStringAsync(url));

            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Gideon: An error occured while trying to dbect. ERROR: " + e);
        }
    }
 **This is the code that specify the folder for the sqlite connection**

 public class DatabaseConnection_iOS: Services.IDatabaseConnection
{
    public SQLiteAsyncConnection DbConnection()
    {
        var dbName = "MyDb.db3";
        string personalFolder =
          Environment.
          GetFolderPath(Environment.SpecialFolder.Personal);
        string libraryFolder =
          Path.Combine(personalFolder, "..", "Library");
        var path = Path.Combine(libraryFolder, dbName);
        return new SQLiteAsyncConnection(path);
    }
}
...