1

有一个奇怪的问题,这似乎很常见,但我无法找到合适的解决方案。也许你们可以帮我弄清楚我哪里出错了。

这是我的通用数据库适配器类

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

我读过很多帖子,也浏览过很多论坛。我用来创建这个的例子可以在这里找到:

Android中的多个表SQLite DB适配器?

我已经检查并重新检查了我的编码。我怀疑我没有在 create 方法上调用 commonDBclass,但我不知道如何。请帮忙。

谢谢。

4

2 回答 2

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. 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 会引导您找到它们。(另外我不确定为什么你有两个不同的适配器......)

于 2013-04-10T20:52:44.430 回答
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();
于 2013-04-10T20:40:54.627 回答