Проверка базы данных Android SQLite, если запрос существует? - PullRequest
0 голосов
/ 06 января 2019

Привет, я все еще новичок в 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();
    }

}

П.С .: Я вызываю метод в кнопке

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Ваша проблема в том, что в таблице не будет строки, в которой столбец ката имеет значение c , а также (AND) значение d * 1007. * это невозможно, поскольку столбец может иметь только одно значение, поэтому никакие строки не будут извлечены.

Возможно, вы хотите найти строки, которые имеют либо c OR d

, в этом случае вы можете использовать: -

String query= ("select kata from TabelAbjad where kata = '"+c+"' OR kata = '"+d+"'");
  • т.е. AND был изменен на OR

Кроме того, execSQL не может вернуть результат согласно: -

Выполнить одну инструкцию SQL, которая НЕ является SELECT или любым другим SQL оператор, который возвращает данные. ExecSQL

Таким образом, вам необходимо либо использовать метод rawQuery, либо метод удобства query, последний рекомендуется, если только его ограничения не означают, что его нельзя использовать. Таким образом, вы должны попытаться использовать что-то вроде (ИЛИ вместо 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 ....} можно использовать для перемещения по всем строкам курсора). Курсор .

После правильного позиционирования в строке, вы можете использовать get????(column_offset) для извлечения данных, поступивших из базы данных (где column_offset - целое число с 0, представляющим первый столбец, однако обычно оно значительно разумнее получить фактическое смещение, используя метод getColumnIndex (метод column_name_as_a_string.))

Итак, если вы хотите, чтобы данные (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.
0 голосов
/ 06 января 2019

Вам не хватает точки с запятой (;) в строке запроса. Попробуйте это String query= ("select kata from TabelAbjad where kata = '"+c+"' AND kata = '"+d+"';"); для всех ваших строк запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...