Выполнение запроса SQLite в Android - PullRequest
0 голосов
/ 26 мая 2020

Я новичок в запросах SQLite в android. Пытаюсь выполнить запрос. Однако приложение продолжает вылетать со следующей ошибкой:

Вызвано: java .lang.IllegalStateException: не удалось прочитать строку 1, столбец -1 из CursorWindow. Убедитесь, что Курсор правильно инициализирован перед доступом к данным из него.

Ниже приведен фрагмент кода

public String getOutputData(){
    String inputData = "'Vineet'";

    Cursor cursorNew = db.rawQuery("SELECT email FROM groupseries INNER JOIN email " +
            "ON groupseries.emailid = email._id INNER JOIN user ON " +
            "groupseries.userid = user._id WHERE name=" + inputData, null);
    cursorNew.moveToFirst ();
    StringBuffer buffer = new StringBuffer();

    while(cursorNew.moveToNext()){
        int index1 = cursorNew.getColumnIndex(DatabaseHelper.KEY_NAME);
        int index2 = cursorNew.getColumnIndex(DatabaseHelper.KEY_EMAIL);
        String userID = cursorNew.getString(index1);
        String emailID = cursorNew.getString(index2);
        buffer.append(userID + " " + emailID + "\n");
    }
    return buffer.toString();
}

Ниже приведен код для создания таблицы, которую я использую. (Открыт для предложений, чтобы сделать это менее неуклюжим).

private static final String DATABASE_NAME = "tryDemoDataBase.db";
    private static final String TABLE_NAME_USER = "user";
    private static final String TABLE_NAME_EMAIL = "email";
    private static final String TABLE_NAME_GROUP = "groupseries";
    private static final int DATABASE_VERSION = 12;
    private static final String KEY_ROWID_USER = "_id";
    private static final String KEY_ROWID_EMAIL = "_id";
    private static final String KEY_ROWID_GROUP = "_id";
    private static final String REFERENCE_USER_ID = "userid";
    private static final String REFERENCE_EMAIL_ID = "emailid";
    private static final String KEY_NAME="name";
    private static final String KEY_EMAIL = "email";
    private static final String CREATE_TABLE_USER = "create table "+ TABLE_NAME_USER
            + " ("+ KEY_ROWID_USER+" integer primary key autoincrement, "
            + KEY_NAME + " text)";
    private static final String CREATE_TABLE_EMAIL = "create table "+ TABLE_NAME_EMAIL
            + " ("+ KEY_ROWID_EMAIL+" integer primary key autoincrement, "
            + KEY_EMAIL + " text)";
    private static final String CREATE_TABLE_GROUP = "create table " + TABLE_NAME_GROUP+ " ("
            + KEY_ROWID_GROUP+" integer primary key autoincrement, "
            + REFERENCE_USER_ID + " integer, " + REFERENCE_EMAIL_ID + " integer)";

1 Ответ

2 голосов
/ 26 мая 2020

Сначала удалите эту строку:

cursorNew.moveToFirst();

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

while (cursorNew.moveToNext())

, поэтому на самом деле вы пропускаете первую (и, возможно, единственную) строку результатов. Затем вы должны включить в выбранные столбцы столбец name, если вы хотите получить его из объекта Cursor:

Cursor cursorNew = db.rawQuery("SELECT name, email FROM groupseries INNER JOIN email " +
            "ON groupseries.emailid = email._id INNER JOIN user ON " +
            "groupseries.userid = user._id WHERE name=" + inputData, null);

И предложение использовать рекомендуемый и безопасный способ передачи параметров в запрос вместо их прямого объединения. Используйте заполнители ?:

String inputData = "Vineet"; // no quotes
Cursor cursorNew = db.rawQuery(
            "SELECT name, email FROM groupseries INNER JOIN email " +
            "ON groupseries.emailid = email._id INNER JOIN user ON " +
            "groupseries.userid = user._id WHERE name=?", 
             new String[] {inputData}
);
...