在何处创建SQLite DB以及如何在任何页面中创建Select语句

时间:2018-07-09 12:31:34

标签: xamarin.forms sqlite-net

使用SQLite的xamarin表单的新功能。我需要一些有关如何在Xamarin表单中使用SQLite的指导。下面是代码。

1) Create Interface 

using System;
using SQLite.Net;

namespace SQLiteSample
{
    public interface ISQLite
    {
        SQLiteConnection GetConnection();
    }
}


2) Implementing ISQLite interface

using System;
using Xamarin.Forms;
using SQLiteEx.Droid;
using System.IO;

[assembly: Dependency(typeof(SqliteService))]
namespace SQLiteEx.Droid
{
    public class SqliteService : ISQLite
    {
        public SqliteService() { }

        public SQLite.Net.SQLiteConnection GetConnection()
        {
            var sqliteFilename = "myDB.db3";
            // Documents folder
            string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
            var path = Path.Combine(documentsPath, sqliteFilename);

            Console.WriteLine(path);

            if (!File.Exists(path)) File.Create(path);
            var plat = new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid();
            var conn = new SQLite.Net.SQLiteConnection(plat, path);
            // Return the database connection 
            return conn;
        }

    }
}


3) Class for Database Operation :CRUD

using SQLite.Net;
using Xamarin.Forms;

namespace SQLiteEx
{
    public class DataAccess
    {
        SQLiteConnection dbConn;
        public DataAccess()
        {
            dbConn = DependencyService.Get<ISQLite>().GetConnection();
            // create the table(s)
            dbConn.CreateTable<Employee>();
        }

        public List<Employee> GetAllEmployees()
        {
            return dbConn.Query<Employee>("Select * From [Employee]");
        }

        public int SaveEmployee(Employee aEmployee)
        {
            return dbConn.Insert(aEmployee);            
        }

        public int DeleteEmployee(Employee aEmployee)
        {
            return dbConn.Delete(aEmployee);
        }

        public int EditEmployee(Employee aEmployee)
        {
            return dbConn.Update(aEmployee);
        }
    }
}

我想知道:

1)在哪里创建可以在整个应用程序中使用的数据库。这意味着我可以在任何页面的任何地方使用它,而不必每次都需要重新创建它。

2)每次在上述代码中都会重新创建表吗?

3)如何在任何页面(即CustomerPage.xaml或SalesPage.xaml)中执行select语句?

在WinRT中,我使用了以下代码。如何以Xamarin形式进行?我需要重新创建SQLite DB吗?如何获取路径?

Using (var db = new SQLite.SQLiteConnection(App.DBPath){

  var query = db.query<CashReceivable>("select * from CashRcvdTbl where Cust='" + Id + "'";

   foreach( var item in query)
  {

   }

}

1 个答案:

答案 0 :(得分:0)

1)在这里,

string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

您的ISQlite实现中的这一行指向您的myDB.db3 SQLite文件。 您可以在/data/data/@APP_PACKAGE_NAME@/files目录中看到此文件。

if (!File.Exists(path)) File.Create(path);

此行检查数据库文件是否在上述路径中。如果不是,那么它将一次创建此文件。这次它将是一个空的sqlite文件,其中没有任何表。 因此,它不会每次都重新创建。

但是,我认为不需要检查此文件是否存在,因为在创建与SQLite文件的连接时,如果不存在,它将自动创建文件。

因此,它可以很简单,如下所示:

public class SqliteService : ISQLite
{         
    string dpPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), “myDB.db3”);
    public SQLiteConnection GetConnection()
    {
        return new SQLiteConnection(new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid(), dpPath, false);
    }
}

2)每次创建DataAccess类的实例时,它将基于Table是否存在重新创建Employee表/定义,因为它调用{{1} } 我通常在应用程序启动代码中写这一行。

dbConn.CreateTable<Employee>();

如果表不存在,这只会在public App () { InitializeComponent (); //Create all tables here. This will create them once when app launches. using (var conn = DependencyService.Get<ISQLite>().GetConnection()) { conn.CreateTable<Employee>(); } MainPage = new HomePage (); } 文件中创建一个新表,否则将更新表定义。

3)您可以执行以下select语句:

SQLite

您可以在任何页面中调用此public List<Employee> GetAllEmployees() { using (var conn = DependencyService.Get<ISQLite>().GetConnection()) { return conn.Table<Employee>().ToList(); //OR return conn.Query<Employee>("Select * From Employee"); } } 方法来检索GetAllEmployees的列表。