Xamarin Android C# SQLite 参数查询

Posted

技术标签:

【中文标题】Xamarin Android C# SQLite 参数查询【英文标题】:Xamarin Android C# SQLite Parameter Query 【发布时间】:2018-11-26 06:06:49 【问题描述】:

我正在尝试根据 Xamarin android C# 中的参数返回数据。拉回所有数据时,下面的代码可以正常工作,但是我需要使用 SQLite WHERE 查询来返回特定数据。

我需要使用 AutoCompleteTextView 字段中的值作为参数..

       protected override void OnCreate(Bundle savedInstanceState)
    
        base.OnCreate(savedInstanceState);
        // Set our view from the "main" layout resource
        //ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
        SetContentView(Resource.Layout.Main);
        db = new DBHelper(this);
        sqliteDB = db.WritableDatabase;

        container = FindViewById<LinearLayout>(Resource.Id.container);

        var btnEmergencyServices = FindViewById<Button>(Resource.Id.btnEmergencyServices);
        btnEmergencyServices.Click += btnEmergencyServices_onClick;
    

private void EmergencyServicesData()
    
        ICursor selectData = sqliteDB.RawQuery("select POLICE, FIRE, MEDICAL from EmergencyServices WHERE COUNTRY = @Country", new string[]  );
        if (selectData.Count > 0)
        
            selectData.MoveToFirst();
            do
            
                EmergencyServices emergencyServices = new EmergencyServices();
                emergencyServices.POLICE = selectData.GetString(selectData.GetColumnIndex("POLICE"));
                emergencyServices.FIRE = selectData.GetString(selectData.GetColumnIndex("FIRE"));
                emergencyServices.MEDICAL = selectData.GetString(selectData.GetColumnIndex("MEDICAL"));
                EmergencyServices.Add(emergencyServices);
            
            while (selectData.MoveToNext());
            selectData.Close();
        
        foreach (var item in EmergencyServices)
        
            LayoutInflater layoutInflater = (LayoutInflater)BaseContext.GetSystemService(Context.LayoutInflaterService);
            View addView = layoutInflater.Inflate(Resource.Layout.EmergencyServices, null);
            TextView txtPolice = addView.FindViewById<TextView>(Resource.Id.txtPolice);
            TextView txtFire = addView.FindViewById<TextView>(Resource.Id.txtFire);
            TextView txtMedical = addView.FindViewById<TextView>(Resource.Id.txtMedical);
            txtPolice.Text = item.POLICE;
            txtFire.Text = item.FIRE;
            txtMedical.Text = item.MEDICAL;
            container.AddView(addView);
        
    

【问题讨论】:

您的实际问题是什么? 如何在查询中使用参数? 如果是这种情况,我真的无法判断,但如果您在任何地方使用 SqliteCommand,请使用 Parameters 集合属性。 DBHelper 到底是什么 【参考方案1】:

如何在查询中使用参数?

假设您使用的是 Sqlite 网络包变体之一(我使用 sqlite-net-pcl),您将创建一个字符串数组,其中包含将在 SQL 查询中替换的参数按顺序 (标记为?)。

在这个示例中,直接从我的一个应用程序中提取,在方法中传递两个参数,一个string 和一个bool

需要将01 的字符串表示形式转换为布尔值在SQLite 中存储为整数。

另一个得到空白修剪,我将 SQL 字符串通配符 % 添加到字符串的开头和结尾。

我用这两个变量创建了一个字符串数组,并且我的 SQL 语句包含两个 ?,它们将按照在 SQL 查询语句中找到的左右顺序替换为这些参数。

示例

public async Task<IList<Package>> DbGetSearchedPackagesAsync(string constraint, bool isUserApp = true)

    var param1 = Convert.ToInt32(isUserApp).ToString();
    var param2 = $"%constraint.Trim()%";
    var packages = await conn.QueryAsync<Package>("SELECT * FROM Package WHERE UserApp = ? AND Name LIKE ? ORDER BY Name COLLATE NOCASE ASC;", new string[2]  param1, param2 );
    return packages;

【讨论】:

谢谢,这真的很有帮助,我假设我可以轻松地将 AutoCompleteTextView 中的值作为我的参数? @WHoward 当然,我的示例来自SearchView(基于Xamarin.Android)并将用户的搜索条目传递给此方法以过滤RecyclerView,在您的情况下,您将采用返回IList 并将其作为自动完成条目下的下拉列表呈现给用户(假设这是您的最终目标)。 有点,用户将输入选择的国家,并基于该数据将返回/显示给用户。再次感谢

以上是关于Xamarin Android C# SQLite 参数查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL/SQLite 工具箱 Visual Studio 2019 在 SQLite 数据库和 Xamarin.Android 项目之间建立连接

xamarin.Android SQLite存储

Xamarin.Android(或者Android Studio)用的数据库是Microsoft Access还是SQLite的?

Xamarin android-应用关闭时推送通知单击删除 SQLite 数据

xamarin.android 的 Sqlite Query<T> 的正确语法

Android Xamarin-使用SQLite时打开计划的通知会停止重复并崩溃