繁体   English   中英

数据库被锁定:在我的 android 和 ios xamarin 应用程序上抛出了 SQLite 异常

[英]Database is locked: SQLite exception thrown on my android and ios xamarin app

数据库非常稳定,直到我完成了所有的包和包签名并将应用程序部署到应用程序中心进行分布式测试,然后我开始从 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();
    }       

这是执行插入和更新的代码,我有三种方法,如下所示访问数据库和许多使用应用程序中的 Db 的查询

    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);
    }
}

就我而言,我将 SaveContext 放在 foreach 中

            var transaction = _context.Database.BeginTransaction();

            try
            {
                foreach (var item in obj)
                {
                    _context.EntrevistaNacionals.Add(item);
await _context.SaveChangesAsync(); //--wrong 
                }
                
                transaction.Commit();

                return true;
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM