Несколько таблиц в базе данных Android - нет такой таблицы
Возникла странная проблема, которая кажется распространенной, но я не могу найти правильное решение. Может быть, вы, ребята, можете помочь мне понять, где я иду не так.
Это мой общий класс адаптеров БД
package com.example.mobilebillforecaster;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class CommonDBclass {
public static final String DATABASE_NAME = "mbfDB";
public static final int DATABASE_VERSION = 1;
public static final String CREATE_ETI_TABLE =
"CREATE TABLE etisalatdb (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ EtiTariffDB.KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ EtiTariffDB.KEY_PACKNAME + " TEXT, " + EtiTariffDB.KEY_PACKRENT
+ " INTEGER, " + EtiTariffDB.KEY_SIMRATE + " INTEGER, "
+ EtiTariffDB.KEY_NATMINSBUN + " INTEGER, "
+ EtiTariffDB.KEY_NATMINSRATE + " INTEGER, "
+ EtiTariffDB.KEY_INTMINSBUN + " INTEGER, "
+ EtiTariffDB.KEY_INTMINSRATE + " INTEGER, "
+ EtiTariffDB.KEY_NATSMSBUN + " INTEGER, "
+ EtiTariffDB.KEY_NATSMSRATE + " INTEGER, "
+ EtiTariffDB.KEY_INTSMSBUN + " INTEGER, "
+ EtiTariffDB.KEY_INTSMSRATE + " INTEGER, "
+ EtiTariffDB.KEY_MMSBUN + " INTEGER, " + EtiTariffDB.KEY_MMSRATE
+ " INTEGER, " + EtiTariffDB.KEY_DATALBUN + " INTEGER, "
+ EtiTariffDB.KEY_DATALRATE + " INTEGER" + ");";
public static final String CREATE_DU_TABLE =
"CREATE TABLE dudatabase(_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ DuTariffDB.KEY_PACKNAME + " TEXT, " + DuTariffDB.KEY_PACKRENT
+ " INTEGER, " + DuTariffDB.KEY_NATMINSRATE + " INTEGER, "
+ DuTariffDB.KEY_NATMOBRATE + " INTEGER, "
+ DuTariffDB.KEY_INTMINSRATE + " INTEGER, "
+ DuTariffDB.KEY_NATSMSRATE + " INTEGER, "
+ DuTariffDB.KEY_INTSMSRATE + " INTEGER, "
+ DuTariffDB.KEY_DATALBUN + " INTEGER, " + DuTariffDB.KEY_DATALRATE
+ " INTEGER" + ");";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public CommonDBclass(Context ctx) {
this.context = ctx;
this.DBHelper = new DatabaseHelper(this.context);
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_ETI_TABLE);
db.execSQL(CREATE_DU_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public CommonDBclass open() throws SQLException {
this.db = this.DBHelper.getWritableDatabase();
return this;
}
public void close() {
this.DBHelper.close();
}
}
и это один из моих адаптеров
package com.example.mobilebillforecaster;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class EtiTariffDB {
public static final String KEY_ROWID = "_id";
public static final String KEY_PACKNAME = "pack_name";
public static final String KEY_PACKRENT = "pack_rent";
public static final String KEY_SIMRATE = "sim_rate";
public static final String KEY_NATMINSBUN = "natmins_bun";
public static final String KEY_NATMINSRATE = "natmins_rate";
public static final String KEY_INTMINSBUN = "intmins_bun";
public static final String KEY_INTMINSRATE = "intmins_rate";
public static final String KEY_NATSMSBUN = "natsms_bun";
public static final String KEY_NATSMSRATE = "natsms_rate";
public static final String KEY_INTSMSBUN = "intsms_bun";
public static final String KEY_INTSMSRATE = "intsms_rate";
public static final String KEY_MMSBUN = "mms_bun";
public static final String KEY_MMSRATE = "mms_rate";
public static final String KEY_DATALBUN = "datal_bun";
public static final String KEY_DATALRATE = "datal_rate";
private static final String DATABASE_TABLE = "etitarifftable";
private DbHelper ourHelper;
private final Context cctext;
private SQLiteDatabase ourDatabase;
private static class DbHelper extends SQLiteOpenHelper {
DbHelper(Context ourContext) {
super(ourContext, CommonDBclass.DATABASE_NAME, null,
CommonDBclass.DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
public EtiTariffDB(Context ctx) {
this.cctext = ctx;
}
public EtiTariffDB open() {
this.ourHelper = new DbHelper(this.cctext);
this.ourDatabase = this.ourHelper.getWritableDatabase();
return this;
}
public void close() {
this.ourHelper.close();
}
public long createEtiTariff(String packname, String packrent,
String simrent, String natbun, String natrate, String intbundle,
String intrate, String natsmsbun, String natsmsrate,
String intsmsbun, String intsmsrate, String mmsbun, String mmsrate,
String datalbun, String datalrate) {
ContentValues cv = new ContentValues();
cv.put(KEY_PACKNAME, packname);
cv.put(KEY_PACKRENT, packrent);
cv.put(KEY_SIMRATE, simrent);
cv.put(KEY_NATMINSBUN, natbun);
cv.put(KEY_NATMINSRATE, natrate);
cv.put(KEY_INTMINSBUN, intbundle);
cv.put(KEY_INTMINSRATE, intrate);
cv.put(KEY_NATSMSBUN, natsmsbun);
cv.put(KEY_NATSMSRATE, natsmsrate);
cv.put(KEY_INTSMSBUN, intsmsbun);
cv.put(KEY_INTSMSRATE, intsmsrate);
cv.put(KEY_MMSBUN, mmsbun);
cv.put(KEY_MMSRATE, mmsrate);
cv.put(KEY_DATALBUN, datalbun);
cv.put(KEY_DATALRATE, datalrate);
return this.ourDatabase.insert(DATABASE_TABLE, null, cv);
}
это часть моего Java-файла, который вызывает БД
EtiTariffDB etisalatDB = new EtiTariffDB(this);
etisalatDB.open();
etisalatDB.createEtiTariff(etipackname, etipackrent, etisimrent,
etinatbun, etinatrate, etiintbundle, etiintrate,
etinatsmsbundle, etinatsmsrate, etiintsmsbundle,
etiintsmsrate,etimmsbundle, etimmsrate,
etidatalocalbundle, etidatalocalrate);
etisalatDB.close();
Ошибка, которую я получаю:
04-10 20:17:47.958: E/SQLiteLog(30526): (1) no such table: etitarifftable
04-10 20:17:48.078: E/SQLiteDatabase(30526): Error inserting natmins_rate=0.30 pack_name=Corporate package natsms_bun=200 mms_rate=0.45 mms_bun=- intsms_rate=0.60 natsms_rate=0.18 intsms_bun=- sim_rate=29 intmins_bun=100 datal_rate=0.1 datal_bun=2000 intmins_rate=1.10 natmins_bun=100 pack_rent=249
04-10 20:17:48.078: E/SQLiteDatabase(30526): android.database.sqlite.SQLiteException: no such table: etitarifftable (code 1): , while compiling: INSERT INTO etitarifftable(natmins_rate,pack_name,natsms_bun,mms_rate,mms_bun,intsms_rate,natsms_rate,intsms_bun,sim_rate,intmins_bun,datal_rate,datal_bun,intmins_rate,natmins_bun,pack_rent) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
Я прочитал много постов и прошел много форумов. Пример, который я использовал для создания этого, находится здесь:
Несколько таблиц SQLite DB адаптер (ы) в Android?
Я проверил и перепроверил мою кодировку. Я подозреваю, что я не вызываю commonDBclass при создании метода, но я не могу понять, как. Пожалуйста помоги.
Благодарю.
2 ответа
У вас есть несколько проблем, которые я сразу заметил:
- У вас просто нет строки для создания таблицы с именем
etitarifftable
, - Вы не выполняете свои
CREATE TABLE
Строки. - Вы изменяете код Java, но не говорите SQLiteOpenHelper обновить схему SQL.
- Таблицы могут иметь только один первичный ключ
Простые решения:
- Либо создать
etitarifftable
или используйте соответствующее имя таблицы в вашем запросе. Добавьте соответствующий
execSQL()
заявления кDbHelper#onCreate()
,@Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_ETI_TABLE); db.execSQL(CREATE_DU_TABLE); }
инкремент
DATABASE_VERSION
который позвонитonUpgrade()
, В своей основной формеonUpgrade()
должен выглядеть так:@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS etisalatdb"); db.execSQL("DROP TABLE IF EXISTS dudatabase"); onCreate(db); }
Удалите одно из ваших объявлений первичного ключа из обеих таблиц:
"CREATE TABLE etisalatdb (EtiTariffDB.KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ...
Наконец, я чувствую, что ошибок больше, но ваш LogCat приведет вас к ним. (Также я не уверен, почему у вас есть два разных адаптера...)
Вам нужно создать таблицу перед вставкой записи, вы делаете это через:
class DbHelper extends SQLiteOpenHelper {
...
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " {definition} ");
}
...
}
Это не похоже на ваше призвание CommonDBclass
совсем. Я думаю, вам нужно переосмыслить и реструктурировать то, как вы это делаете. EtiTariffDB
не должно быть "База данных", это таблица, и вы должны рассматривать ее как единое целое. Используйте CommonDBclass, чтобы получить объект таблицы EtiTariff вместо противоположного. Тогда вы можете сделать что-то вроде:
DatabaseHelper db = new DatabaseHelper();
EtiTariffTable etiTariff = db.getEtiTariffTable();