未创建SQLite表:无此类表

时间:2019-01-17 19:22:52

标签: java android sqlite

我创建了一个数据库,但是未创建其中一个表。 有一个名为“ campanha”的表并可以完美地工作,但是当我尝试创建另一个表(用户)时,即使没有列也说“没有这样的表:用户”

已经尝试:

this.database = this.getWritableDatabase();

创建没有列的表以确保不是sql问题

创建另一个文件以创建另一个表-相同的问题

代码:

public class UserBDHelper extends SQLiteOpenHelper {

    private static  final int DB_VERSION = 1;
    private static final String DB_NAME = "tesp-psi-pl2-07-web";
    private static final String TABLE_NAME = "user";
    private static final String USERNAME = "username";
    private static final String EMAIL = "email";
    private static final String ACCESSTOKEN = "accesstoken";
    private static final String NOMEPROPRIO = "userNomeProprio";
    private static final String APELIDO = "userApelido";
    private static final String MORADA = "userMorada";
    private static final String DATANASC = "userDataNasc";
    private final SQLiteDatabase database;

    public UserBDHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        this.database = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createUsertable = "CREATE TABLE " + TABLE_NAME +
                "(id INTEGER, " +
                USERNAME    + " TEXT NOT NULL, " +
                EMAIL     + " TEXT NOT NULL, " +
                ACCESSTOKEN + " TEXT NOT NULL, " +
                NOMEPROPRIO    + " TEXT NOT NULL, " +
                APELIDO     + " TEXT NOT NULL, " +
                DATANASC     + " TEXT NOT NULL, " +
                MORADA       + " TEXT NOT NULL " +
                ")";

        db.execSQL(createUsertable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        this.onCreate(db);
    }

    public void removeAllUsers(){
        this.database.delete(TABLE_NAME,null,null);
    }

}

日志中的错误是:-

android.database.sqlite.SQLiteException: no such table: user (code 1): , while compiling: DELETE FROM user
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1496)
    at pt.ipleiria.estg.dei.amsi.fixbyte.modelo.UserBDHelper.removeAllUsers(UserBDHelper.java:109)

3 个答案:

答案 0 :(得分:0)

  1. "CREATE TABLE " + TABLE_NAME是无效的表创建语句,因为它没有单个列。您必须至少添加一列才能创建表。

  2. "DROP TABLE IF EXISTS " + TABLE_NAME似乎也很不幸onUpgrade(),因为users表将被删除。

答案 1 :(得分:0)

您不能创建没有列的表。
如果您尝试执行类似

的语句
String createUsertable = "CREATE TABLE " + TABLE_NAME;
db.execSQL(createUsertable);

然后您将得到一个错误,应用程序将崩溃。
因此,如果您的应用程序没有崩溃,则意味着不会执行上述语句,因为未调用oncreate()
因为您的数据库已经存在,所以未调用它。
因此,请卸载应用程序并使用有效的创建语句对该表进行重新运行,
,或将数据库版本更改为2,以便调用onUpgrade()

答案 2 :(得分:0)

我相信您的问题是,对于一个/同一数据库,每个表中可能有多个数据库助手。

也就是说,您显示的那个似乎仅用于 user 表,而您可能还有另一个用于 campanha 表。

数据库助手通常是SQLiteOpenHelper类的子类,该类旨在打开(连接到)数据库。如果数据库文件不存在,它将创建数据库,然后像打开数据库文件一样打开数据库(请注意,只有在尝试访问数据库之前,这种情况才会发生)。

如果数据库文件不存在并创建了文件,则它将调用 onCreate 方法。它只会一次调用 onCreate (删除文件,通常通过清除应用程序的数据或卸载应用程序会导致 onCreate 方法运行)。

因此,如果您为每个表都有一个数据库帮助器,那么当试图访问数据库时,第一个数据库帮助器将看到该数据库文件不存在,创建该文件,然后调用 onCreate 方法。然后,第二个数据库助手会发现该数据库文件存在,并且没有调用它的 onCreate 方法。

就您的代码(假定)而言, campanha 表的数据库助手运行onCreate并创建该表,但 user 表的onCreate却没有得到运行。

解决方法是使用单个数据库帮助程序,该数据库帮助程序使用 onCreate 方法创建两个表,因此您需要组合数据库帮助程序。

您编写的代码(请注意,campanha表很可能不符合您的设计)可能类似于:-

public class UserBDHelper extends SQLiteOpenHelper {

    private static  final int DB_VERSION = 1;
    private static final String DB_NAME = "tesp-psi-pl2-07-web";
    private static final String TABLE_NAME = "user";
    private static final String USERNAME = "username";
    private static final String EMAIL = "email";
    private static final String ACCESSTOKEN = "accesstoken";
    private static final String NOMEPROPRIO = "userNomeProprio";
    private static final String APELIDO = "userApelido";
    private static final String MORADA = "userMorada";
    private static final String DATANASC = "userDataNasc";

    private static final String CAMPANHA_TABLE_NAME = "campanha"; //<<<<<<<<<< ADDED
    private static final String CAMPANHA_MYCOLUMN = "mycolumn"; //<<<<<<<<< ADDED

    private final SQLiteDatabase database;

    public UserBDHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        this.database = this.getWritableDatabase(); //<<<<<<<<<< Note this will access the database so the database will be created when the Database helper is instantiated
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createUsertable = "CREATE TABLE " + TABLE_NAME +
                "(id INTEGER, " +
                USERNAME    + " TEXT NOT NULL, " +
                EMAIL     + " TEXT NOT NULL, " +
                ACCESSTOKEN + " TEXT NOT NULL, " +
                NOMEPROPRIO    + " TEXT NOT NULL, " +
                APELIDO     + " TEXT NOT NULL, " +
                DATANASC     + " TEXT NOT NULL, " +
                MORADA       + " TEXT NOT NULL " +
                ")";

        db.execSQL(createUsertable);

        //<<<<<<<<<< ADDED this block of code
        String createCampanhaTable = "CREATE TABLE + CAMPANHA_TABLE_NAME +
                "(id INTEGER, " +
                CAMPANHA_MYCOLUMN + " TEXT NOT NULL " +
                ")";
        db.execSQL(createCampanhaTable); //<<<<<<<<< ADDED
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        db.execSQL("DROP TABLE IF EXISTS " + CAMPANHA_TABLE_NAME); //<<<<<<<<<< ADDED
        this.onCreate(db);
    }

    public void removeAllUsers(){
        this.database.delete(TABLE_NAME,null,null);
    }
}
  • 注意以上为原则代码,很可能不是是您想要的实际代码,因此很有可能需要进行调整以适应要求。< / li>
  • 请注意,在使用修改后的代码运行之前,您应该删除应用程序的数据或取消添加
  • 注意,您将需要确保仅使用1个数据库助手