如何从sqlite数据库中删除Xamarin中的表

时间:2018-04-01 10:36:38

标签: c# android visual-studio sqlite xamarin

我无法使用命令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();
            }


     }
 }

1 个答案:

答案 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);
}