Xamarin Forms не может создать базу данных SQLite - PullRequest
0 голосов
/ 03 июня 2018

Я строю новый проект, используя Xamarin.Forms, и я хотел использовать SQLite для хранения пользовательских данных.Я использую .Net стандартный проект.Я установил пакет NuGet sqlite-net-pcl Фрэнка А. Крюгера во всех 4 проектах (общий код, droid, ios и uwp).Я создал интерфейс IFileHelper и класс, реализующий этот интерфейс во всех проектах, точно так же, как в документации.Когда я впервые запускаю приложение, я хочу вставить некоторые значения по умолчанию в базу данных, но я просто получаю исключение.Я отлаживал, и когда база данных создается в документе App.xaml.cs, он просто возвращает ноль, поэтому я не получаю никакой базы данных.

Я проверял весь код снова и снова и всехорошо, так что мне просто интересно, совместим ли sqlite-net-pcl со стандартными проектами .NET?Есть ли какое-либо решение для этой проблемы?

Это код на App.xaml.cs

static AppDatabase database;

    public App ()
    {
        InitializeComponent();

        MainPage = new MainPage();
    }

    public static AppDatabase Database
    {
        get
        {
            if (database == null)
            {
                database = new AppDatabase(DependencyService.Get<IFileHelper>().GetLocalFilePath("AppDatabase.db3"));
                System.Threading.Thread.Sleep(500);
            }
            return database;
        }
    }

I, когда я возвращаю базу данных, он просто возвращает ноль, поэтому, когда я создаютаблица в классе AppDatabase, я получаю исключение System.AggregateException: One or more errors occurred.

readonly SQLiteAsyncConnection Database;

        public AppDatabase(string dbPath)
        {
            Database = new SQLiteAsyncConnection(dbPath);
            Database.CreateTableAsync<Stats>().Wait();
        }

Я понимаю исключение, так как база данных пуста, я не могу агрегировать никакие таблицы или что-либо вообще, так как база данных не существует, но почему он не создает базу данных?

Это интерфейс для общего кода

namespace FitApp
{
    public interface IFileHelper
    {
        string GetLocalFilePath(string fileName);
    }
}

И класс, реализующий интерфейс в проекте droid:

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

Спасибо

1 Ответ

0 голосов
/ 04 июня 2018

Я нашел эту страницу действительно полезной для начала работы с SQLite с Xamarin. Xamarin - Работа с локальными базами данных в Xamarin.Forms с использованием SQLite

Обратите внимание, что эта страница не использует базу данных async.

Моя реализация, которая работает.Инициализация;

public SQLiteAsyncConnection AsyncDb { get; private set; }

    public App ()
    {
        InitializeComponent();
        AsyncDb = DependencyService.Get<IDatabaseConnection>().AsyncDbConnection();
}

Интерфейс;

public interface IDatabaseConnection
{
    SQLite.SQLiteAsyncConnection AsyncDbConnection();
}

Реализация Droid;

public class DatabaseConnection_Droid : IDatabaseConnection
{
    public SQLiteAsyncConnection AsyncDbConnection()
    {
        var dbName = "DiceyData.db3";
        var path = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), dbName);
        return new SQLiteAsyncConnection(path);
    }

}

Затем вы можете работать со свойством appwide, например;await ((App)Application.Current).AsyncDb.CreateTableAysnc<YourTypeHere>();

...