簡體   English   中英

SQLite Xamarin.Forms不實例化數據庫

[英]SQLite Xamarin.Forms not instantiating Database

我正在按照此指南將SQLite添加到我的Xamarin.Forms共享資產項目中。 這不是PCL。 我將XAML與代碼隱藏一起使用。

我似乎在所有正確的地方都包含了所有代碼。 我有一個SQLite.cs,其中包含我要進行的所有數據庫調用,還定義了數據庫。

我在一個我知道可以使用的類中定義了一個Interface,並且可以使用它中的其他函數來訪問它。

然后,我在每個平台項目中都有一個類(在droid示例下面已顯示),該類使用該接口獲取本地文件路徑。

最后,在共享資產項目中,我定義並(應該)實例化(我認為)數據庫。

因此,在所有這些就緒的情況下,我嘗試在一個ViewModel中執行數據庫調用。 但是,內部異常表明我遇到了對象引用錯誤。 基本上,當我嘗試執行database.MyMethod()時,我的“數據庫”對象為null。

我不知道為什么它沒有實例化。 有任何想法嗎?

它執行的行是

var dbtimings = TechsportiseData.GetTimingsAsync().Result.ToList();

那方法是...

public static Task<List<Timing>> GetTimingsAsync()
{
    return database.Table<Timing>().ToListAsync();
}

由於database為空,因此跳閘。

SQLite.cs(共享資產項目)

using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;
using static TechsportiseApp.Helpers.GlobalFunctions;
using TechsportiseApp.Models;
using System.Threading.Tasks;
using SQLite;

namespace TechsportiseApp.Data
{
    public class TechsportiseData
    {
        readonly SQLiteAsyncConnection database;

        public TechsportiseData(string dbPath)
        {
            database = new SQLiteAsyncConnection(dbPath);
            database.CreateTableAsync<Scan>().Wait();
            database.CreateTableAsync<Timing>().Wait();
        }


        public static Task<List<Timing>> GetTimingsAsync()
        {
            return database.Table<Timing>().ToListAsync();
        }

        public static Task<List<Timing>> GetTimingsNotUploadedAsync()
        {
            return database.QueryAsync<Timing>("SELECT * FROM [Timing] WHERE [Uploaded] = 0");
        }

        public static Task<Timing> GetTimingAsync(int id)
        {
            return database.Table<Timing>().Where(i => i.Id == id).FirstOrDefaultAsync();
        }

        public static Task<int> SaveTimingAsync(Timing timing)
        {
            if (timing.Id != 0)
            {
                return database.UpdateAsync(timing);
            }
            else
            {
                return database.InsertAsync(timing);
            }
        }

        public static Task<int> DeleteTimingAsync(Timing timing)
        {
            return database.DeleteAsync(timing);
        }

        public static Task DeleteAllTimingsAsync()
        {
            database.DropTableAsync<Timing>().Wait();          
            return database.CreateTableAsync<Timing>();
        }

        public static Task<List<Scan>> GetScansAsync()
        {
            return database.Table<Scan>().ToListAsync();
        }

        public static Task<List<Scan>> GetScansNotUploadedAsync()
        {
            return database.QueryAsync<Scan>("SELECT * FROM [Scan] WHERE [Uploaded] = 0");
        }

        public static Task<Scan> GetScanAsync(int id)
        {
            return database.Table<Scan>().Where(i => i.Id == id).FirstOrDefaultAsync();
        }

        public static Task<int> SaveScanAsync(Scan scan)
        {
            if (scan.Id != 0)
            {
                return database.UpdateAsync(scan);
            }
            else
            {
                return database.InsertAsync(scan);
            }
        }

        public static Task<int> DeleteScanAsync(Scan scan)
        {
            return database.DeleteAsync(scan);
        }

        public static Task DeleteAllScansAsync()
        {
            database.DropTableAsync<Scan>().Wait();
            return database.CreateTableAsync<Scan>();
        }



        public static Task<RaceClock> GetRaceClockAsync()
        {
            return database.Table<RaceClock>().FirstOrDefaultAsync();
        }

        public static Task<int> SaveRaceClockAsync(RaceClock clock)
        {
            return database.InsertAsync(clock);
        }

        public static Task DeleteRaceClockAsync()
        {
            database.DropTableAsync<RaceClock>().Wait();
            return database.CreateTableAsync<RaceClock>();
        }
    }
}

App.xaml.cs

using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using System.Collections.Generic;
using TechsportiseApp.API;
using TechsportiseApp.Views;
using TechsportiseApp.ViewModels;
using TechsportiseApp.Models;
using TechsportiseApp.Helpers;
using TechsportiseApp.Data;
using static TechsportiseApp.Helpers.GlobalFunctions;

//[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace TechsportiseApp
{
    public partial class App : Application
    {
        static TechsportiseData database;



        public App()
        {

            InitializeComponent();


            Application.Current.Properties["APIServer"] = "https://www.techsportise.com/";
            //Application.Current.Properties["APIServer"] = "http://localhost:52693/";

            if (Application.Current.Properties.ContainsKey("ShowHelpOnStartup") == false)
            {
                Application.Current.Properties["ShowHelpOnStartup"] = true;
            }
            if (Application.Current.Properties.ContainsKey("ShowCompletedRaces") == false)
            {
                Application.Current.Properties["ShowCompletedRaces"] = false;
            }
            //MainPage = new NavigationPage(new ResultsProcess());

            //MainPage = new NavigationPage(new Scanning());
            //If the token is present and they are remembered
            if ((Application.Current.Properties.ContainsKey("Token")) && (Application.Current.Properties.ContainsKey("IsRemembered")))
            {
                //And is blank/null
                if (((string)Application.Current.Properties["Token"] == "") || ((GlobalFunctions.PropertyToBool(Application.Current.Properties["IsRemembered"].ToString()) != true)))
                {
                    //They need to login
                    MainPage = new NavigationPage(new Login());
                }
                //Otherwise they can go straight to their page
                else
                {
                    if (GlobalFunctions.PropertyToBool(Application.Current.Properties["ShowHelpOnStartup"].ToString()) == true)
                    {
                        MainPage = new StartupHelp(true);
                    }
                    else
                    {
                        MainPage = new MainMenuMasterDetail();
                    }

                }
            }
            else
            {
                MainPage = new NavigationPage(new Login());
            }
        }

        public static TechsportiseData Database
        {
            get
            {
                if (database == null)
                {
                    database = new TechsportiseData(DependencyService.Get<IFileHelper>().GetLocalFilePath("Techsportise.db3"));
                }
                return database;
            }
        }


        protected override void OnStart()
        {
            // Handle when your app starts
        }

        protected override void OnSleep()
        {
            // Handle when your app sleeps
        }

        protected override void OnResume()
        {
            // Handle when your app resumes
        }
    }
}

界面(共享資產項目)

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Net;
using Xamarin.Forms;

namespace TechsportiseApp.Helpers
{
    public class GlobalFunctions
    {
        public GlobalFunctions()
        {
        }

        public interface IFileHelper
        {
            string GetLocalFilePath(string filename);
        }

        public static bool CheckForInternetConnection()
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
                request.Timeout = 5000;
                request.Credentials = CredentialCache.DefaultNetworkCredentials;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                if (response.StatusCode == HttpStatusCode.OK)
                    return true;
                else
                    //return false;
                    return true;
            }
            catch
            {
                //return false;
                return true;
            }

        }

        public static bool HasPremium()
        {
            var handler = new JwtSecurityTokenHandler();
            var token = handler.ReadToken(Application.Current.Properties["Token"].ToString()) as JwtSecurityToken;
            var premium = token.Claims.FirstOrDefault(claim => claim.Type == "premium").Value.ToString();
            var premiumbool = PropertyToBool(premium);

            return premiumbool;

        }
    }
}

平台類(在此示例中為Droid)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
using TechsportiseApp.Droid;
using static TechsportiseApp.Helpers.GlobalFunctions;
using System.IO;

[assembly: Dependency(typeof(FileHelper))]
namespace TechsportiseApp.Droid
{
    public class FileHelper : IFileHelper
    {
        public string GetLocalFilePath(string filename)
        {
            string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
            return Path.Combine(path, filename);
        }
    }
}

您的數據庫類不一致。 初始化是在實例構造函數中完成的,而數據庫調用是靜態的,這將導致您調用靜態函數,即使實例尚未初始化。

將函數更改為實例函數(從函數中刪除static限定符)或在靜態構造函數上初始化數據庫類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM