C# Xamarin forms query app.database是否始终为空?

C# Xamarin forms query app.database是否始终为空?,c#,android,database,sqlite,xamarin,C#,Android,Database,Sqlite,Xamarin,我正在开发一个Xamarin表单应用程序,并添加了一个本地SQLite数据库。 按照本教程进行设置。 数据库正在工作,但现在突然应用程序停止了。数据库查询总是返回null。我所有的查询都返回null,我已经发布了下面的GetSiteAsync查询作为示例 请参见下面的查询始终返回null var site=await Database.GetSiteAsync() 所有与SQLite db相关的代码都发布在下面 我的App.xaml.cs如下所示: namespace MyApp { publ

我正在开发一个Xamarin表单应用程序,并添加了一个本地SQLite数据库。 按照本教程进行设置。

数据库正在工作,但现在突然应用程序停止了。数据库查询总是返回null。我所有的查询都返回null,我已经发布了下面的GetSiteAsync查询作为示例

请参见下面的查询始终返回null

var site=await Database.GetSiteAsync()

所有与SQLite db相关的代码都发布在下面

我的App.xaml.cs如下所示:

namespace MyApp
{
public partial class App : Application
    {
        static Database database;

        public App ()
        {
            InitializeComponent();

            Resources = new ResourceDictionary();

            MainPage = new NavigationPage(new BeginPage());

            ConnectAsync();
        }

        public static Database Database
        {
            get
            {
                if (database == null)
                {
                    database = new 
                    Database(DependencyService.Get<IFileHelper().GetLocalFilePath("TodoSQLite.db3"));
                }
                return database;
            }
        }
        public async void ConnectAsync()
        {
            var site = await Database.GetSiteAsync();
            //Always null????
        }
    }
}
namespace MyApp.Data
{
    public class Database
    {
        readonly SQLiteAsyncConnection database;

        public Database(string dbPath)
        {
            database = new SQLiteAsyncConnection(dbPath);;
            //database.DropTableAsync<Site>().Wait();

            database.CreateTableAsync<Site>().Wait();
        }
        public Task<Site> GetSiteAsync()
        {
            return database.Table<Site>().Where(i => i.Id == 1).FirstOrDefaultAsync();
        }
    }
}
以及MyApp.Android中的FileHelper

[assembly: Dependency(typeof(FileHelper))]
namespace MyApp.Droid
{
    public class FileHelper : IFileHelper
    {
        public string GetLocalFilePath(string filename)
        {
            string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            return Path.Combine(path, filename);
        }
    }
}
我的数据库类如下所示:

namespace MyApp
{
public partial class App : Application
    {
        static Database database;

        public App ()
        {
            InitializeComponent();

            Resources = new ResourceDictionary();

            MainPage = new NavigationPage(new BeginPage());

            ConnectAsync();
        }

        public static Database Database
        {
            get
            {
                if (database == null)
                {
                    database = new 
                    Database(DependencyService.Get<IFileHelper().GetLocalFilePath("TodoSQLite.db3"));
                }
                return database;
            }
        }
        public async void ConnectAsync()
        {
            var site = await Database.GetSiteAsync();
            //Always null????
        }
    }
}
namespace MyApp.Data
{
    public class Database
    {
        readonly SQLiteAsyncConnection database;

        public Database(string dbPath)
        {
            database = new SQLiteAsyncConnection(dbPath);;
            //database.DropTableAsync<Site>().Wait();

            database.CreateTableAsync<Site>().Wait();
        }
        public Task<Site> GetSiteAsync()
        {
            return database.Table<Site>().Where(i => i.Id == 1).FirstOrDefaultAsync();
        }
    }
}
名称空间MyApp.Data
{
公共类数据库
{
只读SQLiteAsyncConnection数据库;
公共数据库(字符串dbPath)
{
数据库=新的SQLiteAsyncConnection(dbPath);;
//database.DropTableAsync().Wait();
database.CreateTableAsync().Wait();
}
公共任务GetSiteAsync()
{
返回database.Table().Where(i=>i.Id==1.FirstOrDefaultAsync();
}
}
}

我建议检查数据库是否确实有记录。根据代码,它应该有一个id为1的记录,但如果返回的结果为空,它就不会出现。其次,避免使用
async void
,以及将async/Wait与诸如
.Wait()
.result
之类的阻塞调用混合使用。参考文献