我无法使用命令db.DropTable<tablename>
从XAMARIN中的sqLite数据库中完全删除表。它最初会被删除,但每次重新启动应用程序时都会再次出现。此外,我有多个具有相同名称的表,我需要将它们全部删除。我该怎么办?
我正在使用XAMARIN和C#在Visual Studio中开发一个Android应用程序。
不幸的是,我创建了许多具有相同名称的表。现在我需要放弃它们。
我使用以下代码创建表和数据库: -
namespace Test
{
[Table("OrderDetails")]
public class OrderDetails
{
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
[MaxLength(50)]
public string payeename { get; set; }
[MaxLength(100)]
public string commodity { get; set; }
public int give { get; set; }
public int take { get; set; }
public DateTime date { get; set; }
}
[Activity(Label = "Test", MainLauncher = true)]
public class MainActivity : Activity
{
[Table("Items")]
public class PayeeMaster
{
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
[MaxLength(8)]
public string FirstName { get; set; }
[MaxLength(8)]
public string LastName { get; set; }
}
SQLiteConnection db;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
CreateDatabase();
}
public bool ifExists_Table(string tablename)
{
SQLiteCommand command = db.CreateCommand("SELECT COUNT(1) FROM SQLITE_MASTER WHERE TYPE = @TYPE AND NAME = @NAME");
command.Bind("@TYPE", "table");
command.Bind("@NAME", tablename);
int result = command.ExecuteQuery<int>();
return (result > 0);
}
public void CreateDatabase() {
try
{
string dbPath = Path.Combine(
System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
"Master.db3");
db = new SQLiteConnection(dbPath);
}
catch (IOException ex)
{
var reason = string.Format("The database failed to create -
reason {0}", ex.Message);
}
if (!ifExists_Table("PayeeMaster"))
{
db.CreateTable<PayeeMaster>();
}
else
{
var count = db.Table<PayeeMaster>().Count();
}
if (!ifExists_Table("OrderDetails"))
{
db.CreateTable<OrderDetails>();
}
else {
var count = db.Table<OrderDetails>().Count();
}
}
}
答案 0 :(得分:0)
我终于明白了这个问题,对不起这个混乱。
首先 - 执行Table<T>().Count()
实际上并不检查表是否存在,而是检查表是否包含任何行。
要实际检查表是否存在,您必须执行实际的SQL查询:
private bool DoesTableExist(string name)
{
SQLiteCommand command = _connection.CreateCommand("SELECT COUNT(1) FROM SQLITE_MASTER WHERE TYPE = @TYPE AND NAME = @NAME");
command.Bind("@TYPE", "table");
command.Bind("@NAME", name);
int result = command.ExecuteScalar<int>();
return (result > 0);
}