我正在开发一个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活动中原始输入的表,以及更新中的值时第二个活动,它不考虑存储编辑输入的第二个表。但我仍然不知道如何解决这个问题。
答案 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的新实例。