Android - 从不同的活动编辑SqlLite数据库c#

时间:2018-05-08 17:27:11

标签: c# android sql visual-studio sqlite

我正在开发一个C# Android,它接受用户输入并将其添加到数据库,然后在另一个Activity中,它显示用户输入,并提供再次编辑输入的选项。

所以我有2个活动和1个公共课,将它们联系在一起。我正在使用SQLLite将用户输入保存到数据库中(在MainActivity.cs中)然后(在secondActivity中)它从公共数据库中检索保存的值(这是用户输入)(位于名为Class1)的公共类,并将其显示在Textview

的Class1.cs

      namespace App
  {
   public class Class1
    {
     public static string dpPath= Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "user.db3");
      public void Insert(string Quantity, string name)
      {
        var db = new SQLiteConnection(Class1.dpPath);
        var logintable = new LoginTable();
        logintable.quantity = Quantity;
        logintable.name = name;
        db.Insert(logintable);
    }
    public void edit(string Quantity) 
    {
        var db = new SQLiteConnection(Class1.dpPath);
        var logintable = new LoginTable();
        logintable.quantity = Quantity;
        db.Update(logintable);
    }
    public void delete(int id)
    {
        var db = new SQLiteConnection(Class1.dpPath);
        var logintable = new LoginTable();
        logintable.id = id;
        db.Delete(logintable);
    }
    public Class1()
    {
        //Creating database, if it doesn't already exist 
        if (!File.Exists(Class1.dpPath))
        {
            var db = new SQLiteConnection(Class1.dpPath);
            db.CreateTable<LoginTable>();
        }
    }
    public class LoginTable
    {

        [PrimaryKey, AutoIncrement, Column("_Id")]

        public int id { get; set; } // AutoIncrement and set primarykey  

        [MaxLength(25)]

        public string quantity { get; set; }

        [MaxLength(15)]
        public string name { get; set; }

        public LoginTable()
        {

        }
    }
}

MainActivity.cs

    Class1 cl = new Class1():
    cl.Insert(input.ToString(), name.ToLower());

SecondActivity.cs

        Class1 cl = new Class1():
        cl.edit(input.ToString());
        var db = new SQLiteConnection(Class1.dpPath);
        var table = db.Table<Class1.LoginTable>();
        foreach( var item in table) {
        textView.Text += item.name + "     " + item.quantity;
        }

好吧,我进入了textview中的secondActivity,这是第一次输入的输入(在MainActivity中)而不是之后编辑的输入SecondActivity。我想也许是因为我创建了两个不同的Class1实例,每个实例都使用不同的表。另外,我试图在Class1本身内部初始化Class1的公共静态实例:

  

public class Class1 {public static Class1 cl = new Class1(); }

但也没有用,textview仍然显示原始输入而不是编辑过的输入。我需要能够从每个活动中编辑数据库..请帮我找到解决方案。

更新 我创建了一个新类Class2,我在其中初始化了一个Class1的新实例:

    public class Class2 
    { 
          public static Class1 cl = new Class1(); 
    }

然后我试图在Main和second活动中访问class1的这个实例,所以在Main我的代码是:

      Class2.cl.Insert(input.ToString(), name.ToLower());

在第二个活动中我的代码是:

        Class2.cl.edit(input.ToString());
        var db = new SQLiteConnection(Class1.dpPath);
        var table = db.Table<Class1.LoginTable>(); // The issue is in this line
        foreach( var item in table) {
        textView.Text += item.name + "     " + item.quantity;
        }

所以现在我认为问题出现在secondActivity中,var table只得到一个表,即存储Main活动中原始输入的表,以及更新中的值时第二个活动,它不考虑存储编辑输入的第二个表。但我仍然不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

乍一看,您的Edit()方法似乎不正确。你有这个:

public void edit(string Quantity) 
{
    var db = new SQLiteConnection(Class1.dpPath);
    var logintable = new LoginTable();
    logintable.quantity = Quantity;
    db.Update(logintable);
}

但是您无法量化数据库中您希望更新的项目;您只是创建一个新项目,然后尝试使用该项目更新表格。您应该添加一些方法来选择要编辑的项目,例如:

public void Edit(int id, string quantity)
{
   var db = new SQLiteConnection(Class1.dbPath);
   var table = db.Table<Class1.LoginTable>();
   var itemToEdit = table.First(f=>f.Id == id);
   itemToEdit.quantity = quantity;
   db.Update(itemToEdit);
}

如您所见,上面的示例从您的表中获取该项目,编辑该项目并使用您提供的数据更新您的表格。

您的Delete()方法应该遵循类似的路径,而不是仅仅为了删除它而实例化新对象。

关于您的更新,您应该考虑研究Singleton模式。这是处理静态对象的更好方法,而不是Class1/Class2实现。在Class1课程中,添加字段:

public static readonly Class1 Instance = new Class1()

然后从其他类中引用您的实例:

Class1.Instance.Insert(input.ToString(), name.ToLower());

这样就无法意外地创建Class1的新实例。