Android: загрузка из базы данных SQLite - PullRequest
0 голосов
/ 28 сентября 2011

Так что я все еще строю базу данных для поддержки моего проекта. Необходимо сохранить две разные вещи: во-первых, значения атрибутов некоторых объектов игроков, а во-вторых, простые значения, хранящиеся в классе Java.

ATM Моя проблема заключается в процессе загрузки значений объекта проигрывателя и записи его в соответствующий класс.

Теперь давайте посмотрим код:

После вы увидите метод, который я хочу использовать для сохранения значений в базе данных. Это прекрасно работает, но я только что понял, что все еще передаю объекту contentValues ​​дополнительное значение для идентификатора, который я установил - и планировал сохранить таким образом - как автоинкремент. Любая идея, как работать в этом соответственно?

public void savePlayer(Player player[]) {


    for (int i = 0; i <= 3; i++) {


     playerValues.put("ID", i);
     playerValues.put("Name", player[i].getName());
     playerValues.put("HP", player[i].getHp());
     playerValues.put("Satisfaction", player[i].getsatisfaction());
     playerValues.put("Hygiene", player[i].isHygieneInt());
     playerValues.put("IsAlive", player[i].isAliveInt());

     }
     db.insert("playertable", null, playerValues);
}

Ладно, держись за свои шляпы, потому что это может выглядеть как спагетти - метод загрузки:

public void loadPlayer() {
    String[] namecolumn = { "Name" };
    String[] intcolumn = { "ID, HP, Satisfaction, Hygiene, IsAlive" };
    String[] namesToString = new String[4];


    for (int j = 0; j <= 3; j++) {
        Cursor playerCursorName = db.query("playertable", namecolumn, "ID="
                + j, null, null, null, null);
        namesToString = cursorToString(playerCursorName);
        Resource.playerArray[j].setName(namesToString[j]);
    }

    for (int i = 0; i < 3; i++) {
        int[] restToInt;
        Cursor playerCursorInt = db.query("playertable", intcolumn, "ID="
                + i, null, null, null, null);
        restToInt = cursorToInt(playerCursorInt, 4);
        Resource.playerArray[i].setHp(restToInt[i]);
        Resource.playerArray[i].setsatisfaction(restToInt[i]);
        Resource.playerArray[i].setHygieneInt(restToInt[i]);
        Resource.playerArray[i].setAliveInt(restToInt[i]);

    }
}

Да, я знаю, это выглядит довольно уродливо, но позвольте мне объяснить это:

Поскольку есть 4 объекта игрока, я планировал перебирать записи в базе данных, используя идентификатор в качестве идентификатора, чтобы получить ровно одну строку за раз, и записав имя и другие значения этого объекта в java-классе, где я хочу управлять ими в рамках моего проекта.

Примечание: здесь та же проблема с автоинкрементом, что и в методе сохранения

Кроме того, я получаю CursorIndexOutOfBoundsException при вызове loadPlayer, потому что Индекс -1 запрашивается - разве это не результат операции с базой данных, приводящей к ошибке?

Да, в общем-то, я предоставлю вам дополнительный код, если потребуется, надеюсь, кто-нибудь может мне помочь

1 Ответ

0 голосов
/ 28 сентября 2011

Вы используете курсоры здесь немного странным образом.

Смысл курсора - попросить SQLite выполнить тяжелую работу по извлечению данных за вас, а ваша задача - просто использовать курсор дляперебираем возвращаемые значения.

Во-первых, я бы изменил запрос, чтобы запросить все значения в таблице (и, возможно, поставил бы какое-то условие, чтобы ограничить то, что вы возвращаете), чтобы убедиться, что ваш курсор содержит всеваши значения.

Затем я бы перебрал значения курсора с помощью цикла while (с курсором.moveToPosition (-1) перед циклом), перемещаясь вдоль курсора с помощью cursor.moveToNext ().

См. API для получения дополнительной информации:

http://developer.android.com/reference/android/database/Cursor.html

Что касается проблемы автоинкремента, насколько я помню, вы можете опустить ID и использовать db.insert () без этого поля, и база данных предоставит вам идентификатор.

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

...