【问题标题】:Android SQLite Database check if query exists?Android SQLite 数据库检查查询是否存在?
【发布时间】:2019-01-06 17:51:18
【问题描述】:

您好,我还是 android 和 SQLite 的新手。我得到了可以将查询添加到我附加的数据库文件的活动。 问题是,我无法使用我的方法添加数据。有没有简单的方法来检查查询是否存在?

这是我的数据库访问权限

public class DBAccess {
private SQLiteOpenHelper openHelper;
private SQLiteDatabase db;
private static DBAccess instance;
Cursor c = null;

private DBAccess(Context context)
{
    this.openHelper = new DatabaseOpenHelper(context);
}

public static DBAccess getInstance(Context context)
{
    if(instance==null)
    {
        instance=new DBAccess(context);
    }
    return instance;
}

public void open()
{
    this.db = openHelper.getWritableDatabase();
}

public void close()
{
    if(db!=null)
    {
        this.db.close();
    }
}

public void tambah(String a,String b)
{
    String query= ("insert into TabelAbjad (kata,arti) values('"+a+"','"+b+"')");
    db.execSQL(query);
}

public boolean checkdata(String c, String d)
{
    String s;
    String query= ("select kata from TabelAbjad where kata = '"+c+"' AND kata = '"+d+"'");
    db.execSQL(query);
    return true;
}

这是我尝试调用方法的时候

private void adddata()
{
    DBAccess dbAccess = DBAccess.getInstance(getApplicationContext());
    dbAccess.open();
    String k = editkata.getText().toString().trim();
    String a = editarti.getText().toString().trim();
    if (dbAccess.checkdata(k,a))
    {
        Toast.makeText(this, "Data already exists",Toast.LENGTH_LONG).show();
        dbAccess.close();
        finish();
    }
    else
    {
        dbAccess.tambah(k,a);
        dbAccess.close();
        Toast.makeText(this, "Data Saved",Toast.LENGTH_LONG).show();
    }

}

P.S : 我在按钮中调用方法

【问题讨论】:

    标签: android sqlite android-studio


    【解决方案1】:

    您的查询字符串中缺少分号 (;)。 试试这个String query= ("select kata from TabelAbjad where kata = '"+c+"' AND kata = '"+d+"';"); 你所有的查询字符串

    【讨论】:

    • 感谢您的回答,但我的源代码即使没有将 (;) 放入字符串查询中也能正常工作。问题是如果我的数据库中存在查询并将其作为java中的方法调用,我需要创建条件。在我的源代码中,它保持返回 true,我无法添加数据
    • 试试这个 Cursor cursor = dbAccess.checkdata(k,a); if (cursor.getCount() > 0) { Toast.makeText(this, "Data already exists",Toast.LENGTH_LONG).show();}else{//your condition} 并且您的查询类似于“select *from TabelAbjad其中 kata = '"+c+"' AND kata = '"+d+"'"
    【解决方案2】:

    您的问题是表中不存在列 kata 具有值 c 以及 (AND) 值 d 的行 这是不可能的,因为一列只能有一个值,因此不会提取任何行。

    也许您想查找具有 c OR d

    的行

    在这种情况下你可以使用:-

    String query= ("select kata from TabelAbjad where kata = '"+c+"' OR kata = '"+d+"'");
    
    • AND 已更改为 OR

    此外,execSQL 无法返回结果,根据:-

    执行不是 SELECT 或任何其他 SQL 的单个 SQL 语句 返回数据的语句。 execSQL

    因此,您需要使用 rawQuery 方法或方便的 query 方法,后者推荐,除非它的限制意味着它不能使用。因此,您应该尝试使用类似(OR 而不是 AND 假设)的东西:-

    public boolean checkdata(String c, String d)
        boolean rv = false;
        String whereargs = "kata=? OR kata=?"; // the WHERE clause less the WHERE keyword ? for the arguments (used on a 1 for 1 basis)
        String[] whereargs = new String[]{c,d}; // The arguments that will be substituted into the SQL
        String[] columns = new String[]{"kata"};
        Cursor csr = db.query("TabelAbjad",columns,whereclause,whereargs,null,null,null);
        if (csr.getCount() > 0) {
            rv = true;
        }
        csr.close();
        return rv;
    }
    
    • 虽然这可能看起来更复杂的代码,但它在构建底层 SQL 时具有优势,它可以防止 SQL 注入,并且它可以正确地包含/转义(将值括在单引号中等)参数)
    • 您将数据(行)检索到游标中(在这种情况下,您只是想知道是否有任何行与给定条件匹配,因此使用getCount()(它返回提取的行数,如果没有,则可能为 0)) .

    有没有简单的方法来检查查询是否存在?

    我相信你真正的意思是检查查询是否返回任何结果。

    如上所述,查询通过游标返回数据(类似于表格,但根据查询,例如上面的游标将包含许多行(0或更多)具有名为 kata 的单个列(即查询是 SELECT **kata** FROM .....) ),因此您需要使用合适的方法。

    您可以检查/访问许多方面/属性。通常,您会在光标周围移动(例如,while (your_cursor.moveToNext) {.... do things ....} 可用于遍历光标中的所有行)。 Cursor.

    一旦适当地定位在一行,您就可以使用 get????(column_offset) 来检索来自数据库的数据(其中 column_offset 是一个整数,0 代表第一列,但通常是使用 getColumnIndex(column_name_as_a_string 方法) 检索实际偏移量要明智得多。)

    因此,假设您想要上面提取的第一行中的数据(字符串)到 Cursor csr 中,那么您可以使用:-

    if (csr.moveToFirst()) {
       String mykata = csr.getString(csr.getColumnIndex("kata"));
    }
    csr.close(); // You should always close a cursor when done with it.
    

    【讨论】:

      猜你喜欢
      • 2014-04-03
      • 2017-10-21
      • 2017-04-22
      • 2011-03-04
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多