Android SQLiteDatabase не может вставить или запросить - PullRequest
1 голос
/ 04 марта 2012

У меня есть приложение, которое использует несколько баз данных.В настоящее время у меня проблема только с одним из них.Он хранит событие для календаря в базе данных.Его SQLiteOpenHelper выглядит следующим образом:

public class PlanSQLiteHelper extends SQLiteOpenHelper {

//The database version.
public static final int VERSION = 1;

//The String keys of the database name and columns.
public static final String DB_NAME = "plans_db.sqlite";
public static final String PLANS_TABLE = "plans";
public static final String PLAN_ID = "id";
public static final String PLAN_NAME = "name";
public static final String PLAN_YEAR = "year";
public static final String PLAN_MONTH = "month";
public static final String PLAN_DAY = "day";
public static final String PLAN_PRIORITY = "priority";
public static final String PLAN_TIME = "time";
public static final String PLAN_END = "end";
public static final String SET_APPT = "set_appt";
public static final String PLAN_ALARM = "alarm";


public PlanSQLiteHelper(Context context) {
    super(context, DB_NAME, null, VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    createTable(db);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }

private void createTable(SQLiteDatabase db) {

    db.execSQL(
            "create table " + PLANS_TABLE + " ( " +
            PLAN_ID + " integer primary key autoincrement not null, " +
            PLAN_NAME + " text, " +
            PLAN_YEAR + " integer, " +
            PLAN_MONTH + " integer, " +
            PLAN_DAY + " integer, " +
            PLAN_PRIORITY + " integer, " +
            PLAN_TIME + " integer, " +
            PLAN_END + " integer, " +
            SET_APPT + " integer, " +
            PLAN_ALARM + " integer );" );
}
}

Это процесс: пользователь идет на экран, чтобы создать новый элемент календаря (называемый PlanItem).У него есть определенные опции, они выбирают те, которые они хотят, и они нажимают «ОК».PlanItem создается и передается методу в классе Application для приложения, которое выглядит следующим образом:

/**
 * Called to save a PlanItem to the SQLiteDatabase.
 * @param item = the item to save to the database.
 * @param newItem = true if the item is new, false if it exists but was edited.
 * @return true if successful, false otherwise.
 */
public boolean savePlanItem(PlanItem item, boolean newItem) {

    try {

        //Create the ContentValues.
        ContentValues values = new ContentValues();

        //Put the values in.
        values.put(PLAN_NAME, item.getName());
        values.put(PLAN_YEAR, item.getYear());
        values.put(PLAN_MONTH, item.getMonth());
        values.put(PLAN_DAY, item.getDay());
        values.put(PLAN_TIME, item.getTime());
        values.put(PLAN_END, item.getEnd());
        values.put(SET_APPT, item.isSetAppt() ? 1 : 0);
        values.put(PLAN_PRIORITY, item.getPriorityInt());
        values.put(PLAN_ALARM, item.isAlarm() ? 1 : 0);

        if (newItem) {

            //Put into the database.
            long id = plansDatabase.insert(PLANS_TABLE, null, values);

            if (id == -1) {
                return false;
            }
        }
        else {

            //Update the database.
            String where = String.format("%s = ?", PLAN_ID);
            plansDatabase.update(PLANS_TABLE, values, where, new String[] { item.getId() + "" });
        }

    }
    catch (Exception e) {
        return false;
    }

    //Since it succeeded, return true.
    return true;
}

Логический newItem просто сообщает методу, был ли элемент создан или отредактирован.Моя проблема в создании.Как видите, он использует метод SQLiteDatabase.insert ().Я даже беру идентификатор новой строки и проверяю его на -1 (он возвращает -1, если в соответствии с документацией Android произошла ошибка).Несмотря на это, метод возвращает true, что означает, что он сохранен правильно.Затем, как только он сохраняется, действие, позволяющее пользователю создать элемент, завершается и возвращается к действию, в котором он отображается.В onResume () он вызывает класс Application, чтобы получить PlanItems на этот день.Это выглядит так:

/**
 * Called to get the agenda items for a particular day.
 * @param date = the date to get agenda items for.
 * @return the ArrayList of PlanItems for the day.
 */
public ArrayList<PlanItem> getDailyAgenda(Date d) {

    //Make a new date.
    Date date = new Date(d.getDay(), d.getMonth(), d.getYear());

    //Create the ArrayList.
    ArrayList<PlanItem> items = new ArrayList<PlanItem>();

    //Set up a query.
    Cursor cursor = plansDatabase.query(PLANS_TABLE, new String[] {PLAN_ID, PLAN_NAME, PLAN_YEAR,
            PLAN_MONTH, PLAN_DAY, PLAN_PRIORITY, PLAN_TIME, PLAN_END, SET_APPT, PLAN_ALARM},
            String.format(" %s = ? AND %s = ? AND %s = ? ", PLAN_YEAR, PLAN_MONTH, PLAN_DAY),
            new String[] {String.valueOf(date.getYear()), String.valueOf(date.getMonth()),
            String.valueOf(date.getDay())}, null, null, null);

    //Move the cursor to the first position.
    cursor.moveToFirst();

    //If there are items...
    if (!cursor.isAfterLast()) {

        //Initialize variables.
        long id;
        String name;
        int year, month, day, time, end, priority;
        boolean setAppt, alarm;
        PlanItem item;


        //Go through the database and get everything.
        do {

            //Get the values.
            id = cursor.getLong(0);
            name = cursor.getString(1);
            year = cursor.getInt(2);
            month = cursor.getInt(3);
            day = cursor.getInt(4);
            priority = cursor.getInt(5);
            time = cursor.getInt(6);
            end = cursor.getInt(7);
            setAppt = cursor.getInt(8) == 1;
            alarm = cursor.getInt(9) == 1;

            //Create a PlanItem and add it to the ArrayList.
            item = new PlanItem(id, name, year, month, day,
                    priority, time, end, setAppt, alarm);
            items.add(item);

        } while (cursor.moveToNext());
    }

    //Close the cursor.
    cursor.close();

    //Return the items.
    return items;
}

Дата объекта - это мой собственный объект, а не объект Java.Он содержит только те методы, которые мне нужны.

Я проверил и перепроверил запрос в отладчике.Это следует правилам SQLite.Но он ничего не вытаскивает из базы данных, даже сразу после того, как я создаю новый предмет для этого дня.Он попадает в строку return items; и возвращает пустой ArrayList.Я переместился в ближайшие дни, чтобы посмотреть, был ли товар просто хранится не в тот день, но это не так.Я также проверил, какой день, месяц и год вставляются в базу данных.Они верны.

Я пришел сюда в stackoverflow и не смог найти ответ.

Я не могу понять это ради своей жизни.Пожалуйста, помогите.

И так как это мой первый вопрос, любые комментарии о том, как улучшить мой вопрос, приветствуются.

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

Хорошо, вот сделка. Я чувствую себя так глупо сейчас. Проблема решена. Причина, по которой это не сработало, заключается в том, что в некоторых местах я поменял местами год и день в конструкторе объектов MY OWN Date. Я узнал об этом после помещения года, месяца и дня непосредственно в запрос (а не вопросительные знаки). Во всяком случае, я надеюсь, что это был хороший опыт обучения.

0 голосов
/ 05 марта 2012

Вы должны попытаться записать исключение в функцию savePlanItem (), просто чтобы убедиться, что вставки выполнены.

И просто вопрос, где вы открываете базу данных в этих функциях?

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