Я пытаюсь добавить некоторые записи в таблицу SQLite, но LogCat сообщает мне, что таблица не существует. И DDMS показывает, что да, эта таблица не создается/не была создана.
Тем не менее я создаю таблицу в классе SQLiteOpenHelper:
public class SQLiteHandlerDeliveryItem extends SQLiteOpenHelper {
. . .
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String CREATE_DELIVERYITEMS_TABLE = "CREATE TABLE " +
TABLE_DELIVERYITEMS + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_INVOICENUM + " TEXT,"
+ COLUMN_UPCPLU + " TEXT," + COLUMN_VENDORITEMID + " TEXT,"
+ COLUMN_PACKSIZE + " INTEGER," + COLUMN_DESCRIPTION + " TEXT,"
//+ COLUMN_COST + " REAL," + COLUMN_MARGIN + " REAL," + COLUMN_LISTPRICE + " REAL,"
+ COLUMN_COST + " REAL DEFAULT 0," + COLUMN_MARGIN + " REAL DEFAULT 0," +
COLUMN_LISTPRICE + " REAL DEFAULT 0,"
+ COLUMN_DEPTNUM + " INTEGER," + COLUMN_SUBDEPT + " TEXT," + COLUMN_QTY + " TEXT"
+ ")";
sqLiteDatabase.execSQL(CREATE_DELIVERYITEMS_TABLE);
}
Я вызываю метод класса, который добавляет записи:
SQLiteHandlerDeliveryItem sqliteHandler = new SQLiteHandlerDeliveryItem(SQLiteActivity.this, null);
sqliteHandler.addDeliveryItem(delItem);
Это должно вызывать конструктор SQLiteHandlerDeliveryItem (когда создается экземпляр sqliteHandler), но это не так! У меня есть точка останова в методе onCreate(), и, конечно же, она никогда не достигается.
Почему? А как заставить вызвать конструктор, чтобы таблица создавалась?
Странно [наиболее] то, что я также поставил точку останова в другом (рабочем) классе SQLiteOpenHelper, и она тоже не достигнута... что?!? Это сработало хотя бы один раз, так как таблица существует/была создана из этого кода.
Так что, очевидно, где-то в моем качелях есть дыра; что я не так понимаю или делаю не так?
ОБНОВИТЬ
Я слишком рано пометил ответ как ответ.
As to:
"1. В какой-то момент вы должны вызвать getWritableDatabase() или getReadableDatabase()."
Я делаю вызов getWritableDatabase() в каждом методе, создающем или считывающем записи, например так:
public long addDeliveryItem(DeliveryItem delItem) {
long IdAdded = 0;
ContentValues values = new ContentValues();
values.put(COLUMN_INVOICENUM, delItem.get_invoiceNumber());
. . .
values.put(COLUMN_QTY, delItem.get_quantity());
SQLiteDatabase db = this.getWritableDatabase(); <= Rot Cheer
if (db != null) {
IdAdded = db.insert(TABLE_DELIVERYITEMS, null, values);
}
. . .
...и по поводу:
"2. В вашем конструкторе для SQLiteHandlerDeliveryItem вы должны вызвать super(...)".
Я делаю вызов super в классе, расширяющем SQLiteOpenHelper:
public SQLiteHandlerDeliveryItem(Context context, SQLiteDatabase.CursorFactory factory)
{
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
Итак... я до сих пор не знаю, в чем проблема/решение...
ОБНОВЛЕНИЕ 2
Итак, что я вижу при попытке вставить запись в эту таблицу в LogCat:
E/SQLiteLog﹕ (1) нет такой таблицы: deliveryitems
Тем не менее, мой код, который пытается добавить запись, создает соответствующий/соответствующий класс, который расширяет SQLiteOpenHelper следующим образом:
else if ("Delivery Items".equals(tableName)) {
try {
JSONArray jsonArr = new JSONArray(result);
for (int i = 0; i < jsonArr.length(); i++) {
JSONObject jsonObj = jsonArr.getJSONObject(i);
String invNum = jsonObj.getString("invoiceNumber");
. . .
// Prepare for writing to db
DeliveryItem delItem = new DeliveryItem();
delItem.set_invoiceNumber(invNum);
. . .
SQLiteHandlerDeliveryItem sqliteHandler = new
SQLiteHandlerDeliveryItem(SQLiteActivity.this, null);
sqliteHandler.addDeliveryItem(delItem);
}
}
... и этот класс имеет код для создания таблицы:
public class SQLiteHandlerDeliveryItem extends SQLiteOpenHelper {
. . .
public SQLiteHandlerDeliveryItem(Context context, SQLiteDatabase.CursorFactory factory)
{
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String CREATE_DELIVERYITEMS_TABLE = "CREATE TABLE " +
TABLE_DELIVERYITEMS + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_INVOICENUM + " TEXT,"
+ COLUMN_UPCPLU + " TEXT," + COLUMN_VENDORITEMID + " TEXT,"
+ COLUMN_PACKSIZE + " INTEGER," + COLUMN_DESCRIPTION + " TEXT,"
+ COLUMN_COST + " INTEGER," + COLUMN_MARGIN + " INTEGER," + COLUMN_LISTPRICE + " INTEGER,"
+ COLUMN_DEPTNUM + " INTEGER," + COLUMN_SUBDEPT + " TEXT," + COLUMN_QTY + " TEXT"
+ ")";
sqLiteDatabase.execSQL(CREATE_DELIVERYITEMS_TABLE);
}
Итак... что я делаю неправильно или не делаю правильно?
ОБНОВЛЕНИЕ 3
Правда таблица не создается. Сообщение об ошибке в LogCat указывает на то, что это так (это «нет такой таблицы: deliverytitems»).
Мой конструктор выглядит так:
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_DELIVERYITEMS_TABLE = "CREATE TABLE " +
TABLE_DELIVERYITEMS + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_INVOICENUM + " TEXT,"
+ COLUMN_UPCPLU + " TEXT," + COLUMN_VENDORITEMID + " TEXT,"
+ COLUMN_PACKSIZE + " INTEGER," + COLUMN_DESCRIPTION + " TEXT,"
+ COLUMN_COST + " INTEGER," + COLUMN_MARGIN + " INTEGER," + COLUMN_LISTPRICE + " INTEGER,"
+ COLUMN_DEPTNUM + " INTEGER," + COLUMN_SUBDEPT + " TEXT," + COLUMN_QTY + " TEXT"
+ ")";
db.execSQL(CREATE_DELIVERYITEMS_TABLE);
}
Этот код действительно не вводится. Итак, через какой обруч я должен прыгнуть, чтобы вызвать конструктор?
Я думаю, что это произойдет, когда я создам экземпляр класса:
SQLiteHandlerDeliveryItem sqliteHandler = new
SQLiteHandlerDeliveryItem(SQLiteActivity.this, null);
Даже когда он вызывается, как конструктор узнает, что такое arg (SQLiteDatabase db) - откуда он получает это значение?
У меня есть база данных с одной таблицей. Он просто отказывается добавлять эту вторую таблицу.
Как кто-то где-то рекомендовал, я добавляю отдельный класс, который расширяет SQLiteOpenHelper для каждой таблицы, которую я хочу добавить в базу данных.
Когда я дохожу до этой строки:
SQLiteHandlerDeliveryItem sqliteHandler = new
SQLiteHandlerDeliveryItem(SQLiteActivity.this, null);
... и нажмите F7, чтобы войти в него, я доберусь до конструктора класса:
public SQLiteHandlerDeliveryItem(Context context, SQLiteDatabase.CursorFactory factory)
{
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
... но не событие onCreate.
Так что «неудивительно», что у меня нет таблицы deliveryitems, так как код для создания указанной таблицы никогда не достигается; но ПОЧЕМУ он не достигается - что я должен сделать, чтобы он БЫЛ достигнут?