Android 是否可以在没有光标的情况下检查sqlite值安卓

Android 是否可以在没有光标的情况下检查sqlite值安卓,android,sqlite,cursor,Android,Sqlite,Cursor,我试图阻止用户在日历中为约会创建应用程序中的“标题”字段输入与家庭作业相同的字符串值 以下是我到目前为止的想法: private static String[] CHECK = {TITLE}; private Cursor addAppointment(String title, String time, String details){ calendarData = new CalendarData(this); SQLiteDatabase db1

我试图阻止用户在日历中为约会创建应用程序中的“标题”字段输入与家庭作业相同的字符串值

以下是我到目前为止的想法:

private static String[] CHECK = {TITLE};
    private Cursor addAppointment(String title, String time, String details){
        calendarData = new CalendarData(this);
        SQLiteDatabase db1 = calendarData.getReadableDatabase();
        SQLiteDatabase db = calendarData.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DATE, calendar.getDate());
        values.put(TITLE, title);
        values.put(TIME, time);     
        values.put(DETAILS, details);
        db.insertOrThrow(TABLE_NAME, null, values);
        Cursor titleCursor = db1.query(TABLE_NAME, CHECK, TITLE+" = "+appointmentTitle.getText().toString(), null, null, null, null);
        if(titleCursor.getString(0) != null){//MEANING THERE IS A DUPLICATE
            final AlertDialog alertDialog = new AlertDialog.Builder(this).create();
            alertDialog.setMessage("You've entered a duplicate title field, please rename.");
            alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {

                   alertDialog.dismiss();

                } });
            alertDialog.show();
        }
        return titleCursor;
    }
但是我不喜欢把所有东西都放在我的方法中,我宁愿让它保持干净和简单

我试着做以下作为替代:

private static String[] CHECK = {TITLE};
    private void addAppointment(String title, String time, String details){
        calendarData = new CalendarData(this);
        SQLiteDatabase db1 = calendarData.getReadableDatabase();
        SQLiteDatabase db = calendarData.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DATE, calendar.getDate());
        values.put(TITLE, title);
        values.put(TIME, time);     
        values.put(DETAILS, details);
        db.insertOrThrow(TABLE_NAME, null, values);
    }

    private Cursor checkTitle(){
        calendarData = new CalendarData(this);
        SQLiteDatabase db1 = calendarData.getReadableDatabase();

        Cursor titleCursor = db1.query(TABLE_NAME, CHECK, TITLE+" = "+appointmentTitle.getText().toString(), null, null, null, null);

        startManagingCursor(titleCursor);
        return titleCursor;
    }

    private void showTitleError(Cursor cursor){
        if(cursor.getString(0) != null){//MEANING THERE IS A DUPLICATE
            final AlertDialog alertDialog = new AlertDialog.Builder(this).create();
            alertDialog.setMessage("You've entered a duplicate title field, please rename.");
            alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {

                   alertDialog.dismiss();

                } });
            alertDialog.show();
        }
    }
但在这两种情况下我都会遇到这个错误:04-24 17:56:51.263:E/AndroidRuntime(17856):android.database.sqlite.SQLiteException:没有这样的列:hello:,编译时:从title=hello的约会中选择title


如果您有任何建议,请与他人分享,谢谢。

您需要将
appointmentTitle.getText().toString()
用单引号括起来:

db1.query(TABLE_NAME, CHECK, TITLE+" = '"+appointmentTitle.getText().toString() + "'", null, null, null, null);
这样,您的组合查询看起来像:

SELECT title FROM appointments WHERE title = 'hello'

然而,正如其他海报礼貌地指出的那样,如果这里的查询接受用户输入,这可能会导致SQL注入问题。适应参数化方法是更好的方法。

如果您希望安全注射,请使用这种方法

Cursor titleCursor = db1.query(TABLE_NAME, CHECK, TITLE+" = ?",
        new String[]{ appointmentTitle.getText().toString() }, null, null, null);
被下一个参数中引用和转义的数据替换为


提示:如果要强制执行唯一标题,请使数据库列
唯一
。这样,当您插入标题已经存在的数据时,您将得到一个
SQLiteException
。除了预期之外,您还可以在冲突忽略上使列
唯一,这意味着它不会插入数据,也不会抛出错误。

Android真的重新引入了SQL注入吗?我印象深刻。。。但不是这个答案(-1表示更好的方法)。@pst显然更好的方法是参数化查询,但至于它为什么会中断。我还想说,android帮助您避免SQL注入,但它不能让您知道,这是检查数据库中的值与用户输入的值是否相同的正确方法吗?如果(光标!=null)?因为每次我尝试添加一个新的标题时,它都会给我一个警告对话框,而这个对话框不应该被添加happen@AZ1我会检查返回的行数:
if(cursor.getCount>0)
仔细阅读错误消息。请注意,它与标题无关-1(由于缺乏问题/问题细化和严重不正确的标题)和“过于本地化”。这是有意义的,我将考虑使专栏独特,这样我就不必实现警报对话框,因为它将完全阻止用户输入相同的标题。谢谢