2013-04-10 6 views
1

, странная проблема, которая кажется обычной, но я не могу найти правильное решение. Может быть, вы, ребята, можете помочь мне выяснить, где я ошибаюсь.Несколько таблиц на БД Android - нет такой таблицы

Это мой общий DB адаптер класса

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, который вызывает DB

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 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 

Я прочитал много сообщений и прошел через многие форумы. Пример, который я использовал для создания этого можно найти здесь:

Multiple Table SQLite DB Adapter(s) in Android?

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

спасибо.

+0

, если после этого вы добавили таблицу, вам нужно увеличить версию db и реализовать onUpgrade (...), чтобы были созданы новые таблицы. – drunkenRabbit

+1

У вас нет таблицы под названием '' etitarifftable''. Только '' etisalatdb'' и '' dudatabase''. Может ли это быть причиной? – harism

+0

, даже если я удалил весь db? Я попробовал onupgrade и версии, ничего не произошло. Поэтому я удалил БД и попытался ... проделать эту проблему.DB, но нет таблиц. –

ответ

1

У вас есть несколько проблем, я заметил сразу:

  1. Вы просто не имеют строки, чтобы создать таблицу с именем etitarifftable.
  2. Вы не выполняете свои строки CREATE TABLE.
  3. Вы меняете код Java, но не сообщают SQLiteOpenHelper об обновлении схемы SQL.
  4. Таблицы могут иметь только один первичный ключ

Простые решения:

  1. Либо создать etitarifftable или использовать соответствующее имя таблицы в запросе.
  2. Включить соответствующие execSQL() заявления в DbHelper#onCreate().

    @Override 
    public void onCreate(SQLiteDatabase db) { 
        db.execSQL(CREATE_ETI_TABLE); 
        db.execSQL(CREATE_DU_TABLE); 
    } 
    
  3. Increment 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); 
    } 
    
  4. Удалите один из первичного ключа деклараций из обеих таблиц:

    "CREATE TABLE etisalatdb (EtiTariffDB.KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ... 
    

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

+0

Привет Сэм, спасибо за подробный пост. Что касается пункта 2, вы указали, что он должен быть в DBhelper # oncreate(), который находится в моем классе EtiTariffDB. Однако, когда я добавляю execSQL, он пытается создать переменную (например: CREATE_ETI_TABLE), так как это переменная, которая определена в файле commonDBclass. –

+0

Извините, когда я написал этот шаг, я не понял, что вы создали два SQLiteOpenHelpers ... Поскольку 'DbHelper 'only calls' super (ourContext, CommonDBclass.DATABASE_NAME, null, CommonDBclass.DATABASE_VERSION); 'информация DatabaseHelper, вы, вероятно, можете удалить' DbHelper'. – Sam

+0

привет. Не должен ли я определять помощника для EtiTariffDB? если я удалю DBhelper, все методы перестают работать? –

0

Вам нужно создать таблицу, прежде чем вставить запись, вы делаете это с помощью:

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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^