Нет такой таблицы, даже если записи содержимого базы данных и в коде используют сгенерированную модель - PullRequest
0 голосов
/ 08 января 2019

Этот код получает записи Contacts от ContactsDB.db:

public async Task<List<Models.Contacts>> Read()
{
    return await Task.Run(() =>
    {
        SQLiteConnection connection = new SQLiteConnection("ContactsDB.db");
        return _contacts = new List<Models.Contacts>(connection.Table<Models.Contacts>());
    });
}

Это модель таблицы Contacts, созданной набором инструментов SQLite:

public partial class Contacts
{
    [PrimaryKey]
    [NotNull]
    public String ID { get; set; }

    public String FirstName { get; set; }
    public String LastName { get; set; }
    public String PhoneNumber { get; set; }
    public String PathToImage { get; set; }
    public String Email { get; set; }

    public Int64? IsFavorite { get; set; }
    public Int64? GroupID { get; set; }
}

Снимок экрана записей из ContactsDB.

Я изменил параметр Build Action с ContactsDB на Content, но это не меняет ситуацию. В моем прошлом это исключение возникало в ситуации, когда я записывал имя БД в строку подключения, которое не равно имени самой БД. В настоящее время я делаю копирование вставки имени БД, но пока не генерируется исключение.

И даже с сгенерированной моделью и SQLite я не могу найти причины, по которым выбрасывается исключение.

1 Ответ

0 голосов
/ 08 января 2019

Убедитесь, что имя таблицы точно совпадает с именем таблицы в базе данных, используя TableAttribute:

[Table("NameOfYourTableInDb")]
public partial class Contacts
{
   ...
}

Кроме того, я думаю, что вы можете случайно создать новую базу данных в каталоге данных вашего приложения, что, вероятно, не то, что вам нужно, если вы развертываете только для чтения БД со своим проектом. Чтобы получить правильный путь к файлу, вам потребуется следующее

var appDb = await StorageFile.GetFileFromApplicationUriAsync(
    new Uri("ms-appx:///ContactsDB.db"));
SQLiteConnection connection = new SQLiteConnection(appDb.Path);

ms-appx:/// указывает на корень каталога установки приложения.

Однако, если вам также необходимо изменить данные в базе данных, вам сначала необходимо скопировать файл БД в каталог данных приложения:

StorageFile dbFile = null;
try
{
    dbFile = await ApplicationData.Current
       .LocalFolder.GetFileAsync("ContactsDB.db");
}
catch (Exception)
{
    //file does not exist
}
if (dbFile == null)
{
   //copy db deployed with app
   var appDb = await StorageFile.GetFileFromApplicationUriAsync(
       new Uri("ms-appx:///ContactsDB.db")); 
   dbFile = await appDb.CopyAsync(
       ApplicationData.Current.LocalFolder);     
}
SQLiteConnection connection = new SQLiteConnection(dbFile.Path); 
                                                   //same as "ContactsDB.db"

В этом случае я сначала проверяю, была ли БД еще не скопирована, а если нет, я копирую БД, доступную только для чтения, развернутую вместе с приложением, в локальное хранилище приложения, предназначенное для чтения и записи. Обратите внимание, что я мог бы также использовать "ContactsDB.db" в качестве строки подключения напрямую, потому что это предполагает рабочий каталог ApplicationData.Current.LocalFolder. Однако для большей ясности я использовал dbFile.Path.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...