Android - Редактирование базы данных SqlLite из различных видов деятельности c # - PullRequest
0 голосов
/ 08 мая 2018

Я разрабатываю C# Android, который принимает пользовательский ввод и добавляет его в базу данных, затем в другом действии он отображает пользовательский ввод с возможностью снова редактировать его ввод.

Итак, у меня есть 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 следующим образом:

открытый класс Class1 {открытый статический Class1 cl = новый Class1 (); }

но не сработало, textview по-прежнему отображает исходный ввод, а не отредактированный. Мне нужно иметь возможность редактировать базу данных от каждого актива .. Пожалуйста, помогите мне найти решение.

UPDATE Я создал новый класс Class2, и внутри него я инициализировал новый экземпляр Class1, например:

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

А потом я попытался получить доступ к этому экземпляру class1 в Main и Second Activity, поэтому в 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 получает только одну таблицу, в которой хранится исходный вход в основном действии, и при обновлении значения во втором действии, это не касается второй таблицы, в которой хранятся отредактированные данные. Но все же я не знаю, как это решить.

1 Ответ

0 голосов
/ 09 мая 2018

На первый взгляд кажется, что ваш 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.

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