我在java中有一个数据库类,我正在尝试在sqlite中创建一个新表。应用程序编译时会创建表格但由于某种原因,当我添加新行以添加新表格时,它不会被创建。我的db类看起来像这样:
public static final String DATABASE_NAME = "something_db";
private Lock writeLock;
private boolean locked;
private DataBase(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
writeLock = new ReentrantLock();
}
@Override
public void onCreate(SQLiteDatabase db)
{
onCreateV1(db);
onCreateV2(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
if(oldVersion == 1 && newVersion == 2)
{
onCreateV2(db);
}
}
private void onCreateV1(SQLiteDatabase db)
{
db.execSQL("create table schedule (id integer, day integer, start text, end text, points double, unique(id) on conflict replace)");
db.execSQL("create table zone(id integer, name text, imageUrl text, imageFileName text, points double, unique(id) on conflict replace)");
db.execSQL("create table zoneLocation(zoneId integer, locationOrder integer, latitude double, longitude double, unique(zoneId, locationOrder) on conflict replace)");
db.execSQL("create table userLocation(id integer primary key, timestamp integer, latitude double, longitude double, speed double)");
db.execSQL("create table userPoint(id integer primary key, timestamp text, scheduleId integer, scheduleMultiplier double, speedRangeId integer, speedRangeMultiplier double, zoneId integer, zoneMultiplier double, latitude double, longitude double, total double, sent integer)");
db.execSQL("create table userTransaction(userId integer, date text, points double, unique(userId, date) on conflict replace)");
db.execSQL("create table speedRange(id integer, name text, lowerLimit double, points double, unique(id) on conflict replace)");
我尝试添加一个新行来创建一个新表,但每次编译应用程序时都会告诉我
E / SQLiteLog:(1)没有这样的表:UserTopChallengers
不应该只是沿着正在创建的其他表添加该行应该足够吗?为什么我添加的表不是与其他表一起创建的。
答案 0 :(得分:0)
onCreate
方法仅在创建数据库时运行一次。如果删除App的数据或卸载App,则将删除作为App数据一部分的数据库,然后运行onCreate
方法。注意到删除应用程序的数据将丢失您可能拥有的任何数据。
您的onUpgrade
方法可能有效也可能无效(无法用提供的部分代码说明),可能是后者,因为您似乎没有丢弃表格(例如DROP TABLE your_table_name;
),所以你由于已存在的表将导致错误
- (CREATE TABLE IF NOT EXISTS .....
可以避开此问题,但即使是任何修改,例如也不会添加新列)。
您可能会发现删除应用程序数据或卸载应用程序然后重新运行应用程序更加简单。没有完整的代码,就可以给出具体的解决方案。