2017-02-07 4 views
0

Я извлекаю значения из базы данных sqlite в приложении iOS. Я написал инструкцию Select, как stringquery = "Select * from tablename" и выполнил ее, используяСсылка на объект не установлена ​​в экземпляр объекта - Выберите оператор Sqlite Xamarin iOS

database.Query < table> (stringquery);

и присвоение значений свойствам класса. Класс имеет свойства с тем же именем, что и столбцы в таблице в базе данных sqlite.

как выше выполняется оператор, я получаю ошибку Ссылка на объект не указывает на экземпляр объекта

Просьба предложить решение этой проблемы.

Благодаря

+0

Вы смутно описать то, что вы делаете, но не сказать, что проблема есть. –

+0

@ deckertron_9000, если вы прочтете название и описание, и вы узнаете, что я делаю, и что проблема. Но для вашего понимания я редактирую вопрос. – iphonedev23

+0

Когда выбрано исключение, какой объект делает исключение, имеет значение null? –

ответ

1

Это звучит, как вы инициализации базы данных SQLite неправильно. Я добавил код ниже, который показывает, как реализовать базу данных SQLite в Xamarin.Forms.

Это приложение Xamarin.Forms, содержит полностью реализована база данных SQLite: https://github.com/brminnick/InvestmentDataSampleApp

ISQLite.cs

Создать этот файл в Xamarin.Forms PCL. Это позволяет получить доступ к IOS и Android файловых систем для создания нашего соединения с базой данных

using SQLite; 

namespace SampleApp 
{ 
    public interface ISQLite 
    { 
     SQLiteAsyncConnection GetConnection(); 
    } 
} 

SQLite_Android.cs

Создайте этот файл в проекте Android. Он возвращает путь к файлу Android для нашего соединения базы данных SQLite.

using System.IO; 

using SampleApp.Droid; 

using SQLite; 

using Xamarin.Forms; 

[assembly: Dependency(typeof(SQLite_Android))] 
namespace SampleApp.Droid 
{ 
    public class SQLite_Android : ISQLite 
    { 
     #region ISQLite implementation 
     public SQLiteAsyncConnection GetConnection() 
     { 
      var sqliteFilename = "DatabaseFileName.db3"; 
      string documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); // Documents folder 
      var path = Path.Combine(documentsPath, sqliteFilename); 

      var conn = new SQLiteAsyncConnection(path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache); 

      // Return the database connection 
      return conn; 
     } 
     #endregion 
    } 
} 

SQLite_iOS.cs

Создайте этот файл в проекте IOS. Он возвращает путь к файлу iOS для нашего соединения базы данных SQLite.

using System; 
using System.IO; 

using SQLite; 

using Xamarin.Forms; 

using SampleApp.iOS; 

[assembly: Dependency(typeof(SQLite_iOS))] 
namespace SampleApp.iOS 
{ 
    public class SQLite_iOS : ISQLite 
    { 
     #region ISQLite implementation 
     public SQLiteAsyncConnection GetConnection() 
     { 
      var sqliteFilename = "DatabaseFileName.db3"; 
      string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // Documents folder 
      string libraryPath = Path.Combine(documentsPath, "..", "Library"); // Library folder 
      var path = Path.Combine(libraryPath, sqliteFilename); 

      var conn = new SQLiteAsyncConnection(path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache); 

      // Return the database connection 
      return conn; 
     } 
     #endregion 
    } 
} 

SampleModelDatabase.cs

Создайте этот файл в вашем Xamarin.Forms PCL

using System.Linq; 
using System.Threading.Tasks; 
using System.Collections.Generic; 

using SQLite; 

using Xamarin.Forms; 

namespace SampleApp 
{ 
    public static class SampleModelDatabase 
    { 
     #region Constant Fields 
     static readonly SQLiteAsyncConnection _database = DependencyService.Get<ISQLite>().GetConnection(); 
     #endregion 

     #region Fields 
     static bool _isInitialized; 
     #endregion 

     #region Methods 

     public static async Task<IList<SampleModel>> GetAllItemsAsync() 
     { 
      if (!_isInitialized) 
       await Initialize(); 

      return await _database.Table<SampleModel>().ToListAsync(); 
     } 

     public static async Task<int> SaveItemAsync(SampleModel model) 
     { 
      if (!_isInitialized) 
       await Initialize(); 

      return await _database.InsertOrReplaceAsync(model); 
     } 

     public static async Task<int> DeleteItemAsync(SampleModel model) 
     { 
      if (!_isInitialized) 
       await Initialize(); 

      return await _database.DeleteAsync(model); 
     } 

     public static async Task<int> GetNumberOfRowsAsync() 
     { 
      if (!_isInitialized) 
       await Initialize(); 

      return await _database.Table<SampleModel>().CountAsync(); 
     } 

     static async Task Initialize() 
     { 
      await _database.CreateTableAsync<SampleModel>(); 
      _isInitialized = true; 
     } 
     #endregion 
    } 
} 
Смежные вопросы