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

标签 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();
            }


     }
 }

最佳答案

我终于明白了问题所在,抱歉给您带来了困惑。

首先 - 做 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);
}

关于c# - 如何从 sqlite 数据库中删除 Xamarin 中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49597166/

相关文章:

android - 如何在特定条件下清除喷气背包数据存储数据

c# - 单元测试看不到我的方法

c# - 如何在PDF文档标题上放置图像和段落?

java - UDP 传输后将字节编码数据转换回 int32 的问题

java - 如何获取Android操作系统中注册的所有 Activity ?

visual-studio - 如何更改 VS Code 中的引用弹出选项卡位置

c# - 几个 .NET 类库对应用程序启动时间的影响

C#,后台 worker 类

c# - 在 ASP.NET MVC 中执行异步操作使用来自 .NET 4 上的 ThreadPool 的线程

Android RecyclerView : Abstract method not implemented