我创建了一个数据库,但是未创建其中一个表。 有一个名为“ 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)
答案 0 :(得分:0)
"CREATE TABLE " + TABLE_NAME
是无效的表创建语句,因为它没有单个列。您必须至少添加一列才能创建表。
"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);
}
}