数据库处理程序全局以xamarin形式的Singleton模式显示

时间:2019-03-19 06:35:45

标签: xamarin xamarin.forms

我正在开发一个具有用于脱机支持的本地数据库的应用程序。因此,我正在使用Sqlite.net.pcl插件,并且该插件对于每个类模型的所有Create,Insert,Update和Delete表都可以正常工作。

但是,我没有为每个Model类创建单独的数据库活动(如insert,get,update),而是尝试使用常见数据库处理程序(DatabasHandler.cs)的singeton模式。

这是我尝试锻炼单身模式的代码,

public void CreateTable<T>() where T : new()
{
    var myClass = new T();
    myDatabase.CreateTableAsync<T>().Wait();
}

我从这样的EmployeeViewModel类中调用了此函数;

App.Database.CreateTable<EmployeeModel>();

这里EmployeeModel是一个模型类,它可以正常工作,上面的函数也成功创建了一个Employee Table。像我这样从每个ViewModel创建其余表的方式相同;

App.Database.CreateTable<SalaryModel>(); // call from SalaryViewModel Page
App.Database.CreateTable<EmployeeAttendanceModel>(); // call from AttendanceViewModel Page

下一步:因此,如何使用相同的(创建表)单例模式将所有列表项插入DatabaseHandler.cs并将其获取。我的问题是;

  1. 如何在DatabaseHandler.cs(Singleton类)中创建用于插入/获取/更新列表的方法?
  2. 如何从其视图模型调用这些方法(插入/获取/更新)? 请帮助我

1 个答案:

答案 0 :(得分:1)

现在我的Old XF应用程序中有一个类似的东西,这就是我实现Singleton的方式,这还将回答您的第一个问题:

  

应如何在DatabaseHandler.cs(Singleton类)中创建用于插入/获取/更新列表的方法?

public class DatabaseHandler: IDisposable
{
private SQLiteConnection conn;
//public static string sqlpath;
private bool disposed = false;

private static readonly Lazy<DatabaseHandler> database = new Lazy<DatabaseHandler>(() => new DatabaseHandler());
private DatabaseHandler() { }
public static DatabaseHandler Database
{
    get
    {
        return database.Value;
    }
}

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (disposed)
        return;

    if (disposing)
    {
        Dispose();
    }

    disposed = true;
}

public bool InitDatabase()
{
    var ifExist = true;
    try
    {
        this.CreateDatabase();

        ifExist = TableExists(nameof(LocationModel), conn);
        if (!ifExist)
            this.CreateTable<LocationModel>();


        return true;
    }

    catch (Exception ex)
    {
        return false;
    }
}

public static bool TableExists(String tableName, SQLiteConnection connection)
{
    var cmd = connection.CreateCommand("SELECT name FROM sqlite_master WHERE type = 'table' AND name = @name", new object[] { tableName });
    //cmd.CommandText = "SELECT * FROM sqlite_master WHERE type = 'table' AND name = @name";
    //cmd.Parameters.Add("@name", DbType.String).Value = tableName;

    string tabledata = cmd.ExecuteScalar<string>();
    return (cmd.ExecuteScalar<string>() != null);
}
public SQLiteConnection GetConnection()
{
    var sqliteFilename = "xamdblocal.db3";
    string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // Documents folder
    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 SQLiteConnection(path);
    // Return the database connection 
    return conn;
}

private bool CreateDatabase()
{       
    conn = GetConnection();
    string str = conn.DatabasePath;
    return true;
}

public bool CreateTable<T>()
    where T : new()
{
    conn.DropTable<T>();
    conn.CreateTable<T>();
    return true;
}

public bool InsertIntoTable<T>(T LoginData)
    where T : new()
{
    conn.Insert(LoginData);
    return true;
}

public bool InsertBulkIntoTable<T>(IList<T> LoginData)
   where T : class //new()
{
    conn.InsertAll(LoginData);
    return true;
}    

public List<T> SelectDataFromTable<T>()
  where T : new()
{
    try
    {
        return conn.Table<T>().ToList();
    }

    catch (Exception ex)
    {
        return null;
    }
}

public List<T> SelectTableDatafromQuery<T>(string query)
    where T : new()
{
    return conn.Query<T>(query, new object[] { })
                .ToList();
}

public bool UpdateTableData<T>(string query)
    where T : new()
{
    conn.Query<T>(query);
    return true;
}

public void UpdateTableData<T>(IEnumerable<T> query)
    where T : new()
{
    conn.UpdateAll(query);
}

public void UpdateTableData<T>(T query)
   where T : new()
{
    conn.Update(query);
}   

public bool DeleteTableData<T>(T LoginData)
{
    conn.Delete(LoginData);
    return true;
}

public bool DeleteTableDataFromPrimaryKey<T>(object primaryKey)
{
    conn.Delete(primaryKey);
    return true;
}

public bool DeleteTableDataFromQuery<T>(string query)
    where T : new()
{
    conn.Query<T>(query);
    return true;
}
}
  

如何从其视图模型调用这些方法(插入/获取/更新)?请帮助我,

现在为例:您想在本地模型中将位置的Lat Long插入本地模型,

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

    public double Latitude { get; set; }

    public double Longitude { get; set; }

    public string Address { get; set; }
}

因此,首先要做的是创建一个LocationModel实例,如下所示:

var locationModel = new LocationModel
        {
            Latitude = location.Latitude,
            Longitude = location.Longitude
        };

Then insert it something like this:

DatabaseHandler.Database.InsertIntoTable<LocationModel>(locationModel);

此外,不要忘记在项目中添加SQLiteNetExtensions以获得Linq支持。

如果遇到查询,Goodluck随时恢复