这是我的课程:
public partial class App : Application
{
public static DataManager db;
public App()
{
InitializeComponent();
MainPage = new Japanese.MainPage(); // 1
}
public static DataManager DB
{
get
{
if (db == null)
{
db = new DataManager();
}
return db;
}
}
protected override void OnStart()
{
App.DB.InitData(); // 2
}
首次运行时出现问题,因为InitData设置了表,但需要表的Japanese.MainPage()在设置表之前运行。
似乎尚未创建所需的表。
将InitData移动到App构造函数中是否合理?
答案 0 :(得分:2)
每个平台调用GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject user, GraphResponse response) {
if (user != null) {
Log.d("FacebookSDK", user.optString("email"));
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email");
request.setParameters(parameters);
request.executeAsync();
来创建Xamarin.Forms应用程序的实例。你可以在例如iOS上的LoadApplication
类:
AppDelegate
正如您所看到的那样,Xamarin Forms本身已初始化,并创建了一个新的应用程序实例。 public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
// Init additional components
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
类在每个特定于平台的项目中实例化,并传递给App
方法,该方法是在加载LoadApplication
并向用户显示时。
由于您使用的MainPage
在其构造函数中使用来自数据库的数据,因此MainPage
中的初始化在生命周期中为时已晚,因为它在创建OnStart
之后发生。将数据库初始化移动到MainPage
构造函数(App
赋值之前)将在您的方案中起作用。确保在平台特定代码中MainPage
调用之前初始化您需要初始化的任何其他组件。
答案 1 :(得分:1)
使用OnStart
的主要原因是应用程序唤醒或再次放入前台时的情景。而不仅仅是第一次运行。因此,每次唤醒手机时都不想初始化数据库。
正如Steven所说,OnStart
在后期阶段与构造函数相比被调用。既然你在MainPage构造函数中做了一些需要DB的逻辑,那么你的app会给出一个null异常。
我想给你两个提示: