Параллелизм Ad в sqlite с использованием статических функций

#c# #sqlite #xamarin

#c# #sqlite #xamarin

Вопрос:

Как правильно управлять SQLiteConnection, чтобы избежать исключения DatabaseConnectionException?

Я попытался поместить некоторые флаги в конструктор sqliteconnection и использовать оператор Using, но, похоже, это не работает

 public class BaseDao
{
    //[...] some static functions

    static string Path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "mysqlite.db3");

    /// <summary>
    /// Searches all records of the specified type
    /// </summary>
    /// <typeparam name="T">the Type to search</typeparam>
    /// <returns>Returns a list of all records of the specified type</returns>
    public static List<T> GetItems<T>() where T : BaseEntity, new()
    {
        List<T> items;

        using (SQLiteConnection connection = new SQLiteConnection(Path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.FullMutex, true))
        {
            try
            {
                items = connection.Query<T>("SELECT * FROM "   typeof(T).Name);
            }
            catch (Exception ex)
            {
                connection.Rollback();
                throw ex;
            }
            finally
            {
                connection.Close();
            }
        }
        return items;
    }
  

(эти функции не вызываются потоком пользовательского интерфейса.)

Комментарии:

1. Почему бы просто не сделать его синглтоном с блокировками?

2. Что такое полное сообщение об исключении?

3. Возможно, правильный вопрос: «Есть ли какой-нибудь правильный способ сделать это с помощью статических функций?»

4. Я не знаю, какое влияние оказывают эти флаги на конструктор, но ваш код выглядит потокобезопасным для меня. Я не уверен, что ваша проблема заключается в параллелизме потоков.

5. Опять же, я не знаю реализацию SQLiteConnection , но вам не нужно закрывать ее в finally блоке, если она объявлена в a using . Какая строка выдает исключение?