首页 > 解决方案 > Xamarin Forms 应用程序抛出“SQLite.SQLiteException:无法打开数据库文件”

问题描述

Xamarin Forms 应用程序在单击导航按钮时引发以下错误。DisplaySoccerStatus();如果我在课堂上评论以下方法,SoccerDailyStatus那么该应用程序将起作用。所以我假设,数据库中很少有为空的记录导致问题?不确定,我该如何解决这个问题?

SQLite.SQLiteException: Could not open database file: /data/user/0/com.companyname.soccerapp/files/.config/soccerpep (CannotOpen

 public partial class SoccerDailyStatus : ContentPage
{
    private SQLiteConnection conn;
    SoccerAvailability status; 

    public SoccerDailyStatus(SoccerAvailability soccerStatus)
    {
        InitializeComponent();
        status = soccerStatus;
        BindingContext = status;
       //DisplaySoccerStatus();
    }

    protected override async void OnAppearing()
    {
        conn = DependencyService.Get<Isqlite>().GetConnection();
        conn.CreateTable<SoccerAvailability>();
        base.OnAppearing();

        async Task DisplaySoccerStatus()
        {
            var datetoday = DateTime.Now.ToString("ddMMyyyy");
            //List<SoccerAvailability> myList = (from x in conn.Table<SoccerAvailability>() select x).ToList();
            List<SoccerAvailability> myList = (from x in conn.Table<SoccerAvailability>().Where(x => x.CurrentDate == datetoday) select x).ToList();
            if (myList != null)
            {
                SoccerAvailability soccerAvailability = new SoccerAvailability();
                soccerAvailability.SoccerStatus = myList[0].SoccerStatus;
                soccerAvailability.CurrentDate = DateTime.Now.ToString("ddMMyyyy");
                await Navigation.PushAsync(new SoccerDailyStatus(soccerAvailability) { });
            }
            else
            {
                await DisplayAlert("Notification", "Unable to proccess status", "Cancel");
            }

        }

        await DisplaySoccerStatus();
    }


}

}

在此处输入图像描述

堆栈跟踪:

05-04 13:51:12.462 D/Mono    (23709): DllImport attempting to load: '__Internal'.
05-04 13:51:12.462 D/Mono    (23709): DllImport loaded library '(null)'.
05-04 13:51:12.462 D/Mono    (23709): DllImport searching in: '__Internal' ('(null)').
05-04 13:51:12.462 D/Mono    (23709): Searching for 'monodroid_get_system_property'.
05-04 13:51:12.462 D/Mono    (23709): Probing 'monodroid_get_system_property'.
05-04 13:51:12.462 D/Mono    (23709): Found as 'monodroid_get_system_property'.
05-04 13:51:12.462 D/Mono    (23709): DllImport searching in: '__Internal' ('(null)').
05-04 13:51:12.462 D/Mono    (23709): Searching for 'monodroid_free'.
05-04 13:51:12.462 D/Mono    (23709): Probing 'monodroid_free'.
05-04 13:51:12.462 D/Mono    (23709): Found as 'monodroid_free'.
05-04 13:51:12.904 D/Mono    (23709): DllImport searching in: 'e_sqlite3' ('libe_sqlite3.so').
05-04 13:51:12.904 D/Mono    (23709): Searching for 'sqlite3_changes'.
05-04 13:51:13.123 I/art     (23709): Starting a blocking GC Explicit
05-04 13:51:13.132 I/art     (23709): Explicit concurrent mark sweep GC freed 206(21KB) AllocSpace objects, 0(0B) LOS objects, 39% free, 3MB/5MB, paused 651us total 8.285ms
05-04 13:51:13.134 D/Mono    (23709): GC_TAR_BRIDGE bridges 87 objects 901 opaque 262 colors 87 colors-bridged 87 colors-visible 87 xref 0 cache-hit 0 cache-semihit 0 cache-miss 0 setup 0.03ms tarjan 0.19ms scc-setup 0.04ms gather-xref 0.02ms xref-setup 0.02ms cleanup 0.74ms
05-04 13:51:13.134 D/Mono    (23709): GC_BRIDGE: Complete, was running for 11.21ms
05-04 13:51:13.135 D/Mono    (23709): GC_MINOR: (Nursery full) time 7.23ms, stw 7.85ms promoted 1963K major size: 2848K in use: 2132K los size: 1024K in use: 55K
05-04 13:51:13.306 D/Mono    (23709): GC_TAR_BRIDGE bridges 0 objects 0 opaque 0 colors 0 colors-bridged 0 colors-visible 87 xref 0 cache-hit 0 cache-semihit 0 cache-miss 0 setup 0.03ms tarjan 0.19ms scc-setup 0.04ms gather-xref 0.02ms xref-setup 0.02ms cleanup 0.02ms
05-04 13:51:13.306 D/Mono    (23709): GC_BRIDGE: Complete, was running for 0.15ms
05-04 13:51:13.307 D/Mono    (23709): GC_MINOR: (Nursery full) time 5.49ms, stw 5.88ms promoted 2025K major size: 4992K in use: 4209K los size: 1024K in use: 55K
05-04 13:51:13.468 D/Mono    (23709): GC_TAR_BRIDGE bridges 0 objects 0 opaque 0 colors 0 colors-bridged 0 colors-visible 87 xref 0 cache-hit 0 cache-semihit 0 cache-miss 0 setup 0.03ms tarjan 0.19ms scc-setup 0.04ms gather-xref 0.02ms xref-setup 0.02ms cleanup 0.03ms
05-04 13:51:13.468 D/Mono    (23709): GC_BRIDGE: Complete, was running for 0.26ms
05-04 13:51:13.468 D/Mono    (23709): GC_MINOR: (Nursery full) time 6.25ms, stw 6.64ms promoted 1963K major size: 7024K in use: 6222K los size: 1024K in use: 55K
05-04 13:51:13.629 D/Mono    (23709): GC_TAR_BRIDGE bridges 0 objects 0 opaque 0 colors 0 colors-bridged 0 colors-visible 87 xref 0 cache-hit 0 cache-semihit 0 cache-miss 0 setup 0.03ms tarjan 0.19ms scc-setup 0.04ms gather-xref 0.02ms xref-setup 0.02ms cleanup 0.03ms
05-04 13:51:13.629 D/Mono    (23709): GC_BRIDGE: Complete, was running for 0.19ms
05-04 13:51:13.629 D/Mono    (23709): GC_MINOR: (Nursery full) time 7.41ms, stw 7.90ms promoted 1886K major size: 9024K in use: 8157K los size: 1024K in use: 55K
05-04 13:51:13.817 D/Mono    (23709): GC_TAR_BRIDGE bridges 0 objects 0 opaque 0 colors 0 colors-bridged 0 colors-visible 87 xref 0 cache-hit 0 cache-semihit 0 cache-miss 0 setup 0.03ms tarjan 0.19ms scc-setup 0.04ms gather-xref 0.02ms xref-setup 0.02ms cleanup 0.03ms
05-04 13:51:13.817 D/Mono    (23709): GC_BRIDGE: Complete, was running for 0.19ms
05-04 13:51:13.817 D/Mono    (23709): GC_MINOR: (Nursery full) time 9.31ms, stw 9.72ms promoted 1818K major size: 10896K in use: 10021K los size: 1024K in use: 55K
05-04 13:51:14.140 I/art     (23709): Starting a blocking GC Explicit
05-04 13:51:14.147 I/art     (23709): Explicit concurrent mark sweep GC freed 156(9KB) AllocSpace objects, 0(0B) LOS objects, 39% free, 3MB/5MB, paused 599us total 6.464ms
05-04 13:51:14.147 D/Mono    (23709): GC_TAR_BRIDGE bridges 29 objects 29 opaque 0 colors 29 colors-bridged 29 colors-visible 29 xref 0 cache-hit 0 cache-semihit 0 cache-miss 0 setup 0.04ms tarjan 0.03ms scc-setup 0.03ms gather-xref 0.02ms xref-setup 0.02ms cleanup 0.27ms
05-04 13:51:14.147 D/Mono    (23709): GC_BRIDGE: Complete, was running for 7.41ms
05-04 13:51:14.147 D/Mono    (23709): GC_MINOR: (Nursery full) time 7.24ms, stw 7.62ms promoted 501K major size: 11472K in use: 10539K los size: 1024K in use: 55K
05-04 13:51:14.157 D/Mono    (23709): DllImport searching in: 'e_sqlite3' ('libe_sqlite3.so').
05-04 13:51:14.158 D/Mono    (23709): Searching for 'sqlite3_close_v2'.
05-04 13:51:14.651 I/Choreographer(23709): Skipped 167 frames!  The application may be doing too much work on its main thread.
05-04 13:51:14.688 E/EGL_emulation(23709): tid 23733: swapBuffers(531): error 0x300d (EGL_BAD_SURFACE)
05-04 13:51:14.688 W/OpenGLRenderer(23709): swapBuffers encountered EGL_BAD_SURFACE on 0x9c46bd40, halting rendering...
05-04 13:51:14.690 D/EGL_emulation(23709): eglMakeCurrent: 0xb077de80: ver 3 1 (tinfo 0x9c459e20)
Unhandled Exception:

SQLite.SQLiteException: Could not open database file: /data/user/0/com.companyname.soccerapp/files/.config/soccerpep (CannotOpen)

标签: sqlitexamarinxamarin.forms

解决方案


我认为问题出在 ctor 中调用的async方法。DisplaySoccerStatus单个数据连接不能同时在两个或多个线程中使用。

我建议两件事:

  1. 打电话给你DisplaySoccerStatusasync onAppearing使用await DisplaySoccerStatus。哦,使用async Task DisplaySoccerStatus而不是async void这样你就可以知道任务何时完成。

async void 情况是“一劳永逸”:您启动任务链,但您不关心它何时完成。当函数返回时,您所知道的就是直到第一次等待为止的所有内容都已执行。第一次等待之后的所有内容都将在未来某个您无法访问的未指定点运行。

  1. 按照官方文档中的建议,在 app.xaml.xs 上声明的单例中移动您的连接

推荐阅读