Почему я получаю исключение нулевой ссылки при попытке получить соединение с базой данных SQLite? - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь создать базу данных SQLite, но получаю исключение. Ошибка не говорит, почему возникает исключение. Это просто говорит об исключении из Null Reference. Исключение происходит в этой строке

var connection = `DependencyService.Get<ISQLiteDB>().GetConnection();`

в конструкторе.

вот мой файл .cs

using App4.Persistence;
using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace App4
{

    public class Contact
    {

        [PrimaryKey,AutoIncrement]
        public int  Id { get; set; }

        [MaxLength (255)]
        public string Name { get; set; }
    }

    public partial class MainPage : ContentPage
    {

        public string ConnectionPath { get; set; }
        public MainPage()
        {
            InitializeComponent();

            var connection = DependencyService.Get<ISQLiteDB>().GetConnection();


        }

        protected async override void OnAppearing()
        {
            var connection = new SQLiteAsyncConnection(ConnectionPath);

            await connection.CreateTableAsync<Contact>();
            var contacts = await connection.Table<Contact>().ToListAsync();
            listViewContacts.ItemsSource = contacts;


            base.OnAppearing();
        }

        private void buttonAdd_Clicked(object sender, EventArgs e)
        {

        }

        private void buttonDelete_Clicked(object sender, EventArgs e)
        {

        }

        private void buttonUpdate_Clicked(object sender, EventArgs e)
        {

        }
    }
}

Вот межконфессиональное соединение, которое я использую для получения пути к пути к базе данных, реализуя его по-разному в iOS и Android

>     
    > using SQLite;
    > using System;
    > using System.Collections.Generic;
    > using System.Text;
    > 
    > namespace App4.Persistence
    > {
    >     public interface ISQLiteDB
    >     {
    >         SQLiteAsyncConnection GetConnection();
    > 
    >     }
    > }

и это реализация в iOS и Android.

using System;
using System.Collections.Generic;
using System.IO;
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 App4.Persistence;
using SQLite;

namespace App4.Droid.Persistence
{
   public class SQLiteDB : ISQLiteDB
    {
        public SQLiteAsyncConnection GetConnection()
        {
            var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
            var  DatabasePath = Path.Combine(documentsPath,"MySQLite.db3");

            return new SQLiteAsyncConnection(DatabasePath);

        }

    }
}

хотя реализация для iOS и Android одинакова (и интерфейс в этом случае не нужен), я буду создавать проекты для окон, требующих другой реализации для получения пути к базе данных.

Любая помощь приветствуется, ребята.

Спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

Проблема с исключением не заключалась в определении attrbute зависимости в классах реализации, я должен был использовать [assembly: Dependency (typeof (SQLiteDB)] чуть выше определения пространства имен, а не в классе.

Хотя я все еще получаю другую ошибку, когда пытаюсь зарегистрировать классы реализации через атрибут зависимости.

Я получаю эту ошибку:

Нет аргумента, соответствующего формальному параметру «LoadHintArgument» или DependecyAtrrbute.DependencyAttribute (строка LoadHint).

Любая помощь по этой теме приветствуется.

...