C# Xamarin forms query app.database是否始终为空?
我正在开发一个Xamarin表单应用程序,并添加了一个本地SQLite数据库。 按照本教程进行设置。 数据库正在工作,但现在突然应用程序停止了。数据库查询总是返回null。我所有的查询都返回null,我已经发布了下面的GetSiteAsync查询作为示例 请参见下面的查询始终返回null var site=await Database.GetSiteAsync() 所有与SQLite db相关的代码都发布在下面 我的App.xaml.cs如下所示: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
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
之类的阻塞调用混合使用。参考文献