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(由于缺乏问题/问题细化和严重不正确的标题)和“过于本地化”。这是有意义的,我将考虑使专栏独特,这样我就不必实现警报对话框,因为它将完全阻止用户输入相同的标题。谢谢