У меня есть приложение, которое использует несколько баз данных.В настоящее время у меня проблема только с одним из них.Он хранит событие для календаря в базе данных.Его 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 и не смог найти ответ.
Я не могу понять это ради своей жизни.Пожалуйста, помогите.
И так как это мой первый вопрос, любые комментарии о том, как улучшить мой вопрос, приветствуются.