Android SQLite问题:';表[…]没有名为';错误

Android SQLite问题:';表[…]没有名为';错误,android,sqlite,android-studio,android-sqlite,Android,Sqlite,Android Studio,Android Sqlite,我不断收到一个错误,在我的表中找不到一列。无法理解为什么会发生这种情况。列名似乎拼写正确 我得到了这个错误: 06-11 21:27:02.701 3703-3703/com.example.luca.contatti E/SQLiteLog﹕ (1) 表Contatti没有名为imageUri的列 这是我的DatabaseHandler页面: public class DatabaseHandler extends SQLiteOpenHelper { public static fi

我不断收到一个错误,在我的表中找不到一列。无法理解为什么会发生这种情况。列名似乎拼写正确

我得到了这个错误:
06-11 21:27:02.701 3703-3703/com.example.luca.contatti E/SQLiteLog﹕ (1) 表Contatti没有名为imageUri的列

这是我的DatabaseHandler页面:

public class DatabaseHandler extends SQLiteOpenHelper {
    public static final String DB_NAME = "dbContatti",
        TABLE = "Contatti",
        ID = "id",
        NAME = "name",
        PHONE = "phone",
        EMAIL = "email",
        ADDRESS = "address",
        IMAGEURI = "imageUri";
public static final int DB_VERSION = 4;

public DatabaseHandler(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
    //Creazione della tabella per il DB
    db.execSQL("CREATE TABLE " + TABLE + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + NAME + "TEXT," + PHONE + "TEXT," + EMAIL + "TEXT," + ADDRESS + "TEXT," + IMAGEURI + "TEXT " + ")");

}

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

    onCreate(db);
}

// CRUD: CREATE

public void createContact (ContactList contact){
    SQLiteDatabase db = getWritableDatabase();

    ContentValues values = new ContentValues();

    values.put(NAME, contact.getName());
    values.put(PHONE, contact.getPhone());
    values.put(EMAIL, contact.getEmail());
    values.put(ADDRESS, contact.getAddress());
    values.put(IMAGEURI, contact.getImageUri().toString());

    db.insert(TABLE, null, values);
    db.close();
}

//CRUD: READ

public ContactList getContact(int id){
    SQLiteDatabase db = getReadableDatabase();

    Cursor cursor = db.query(TABLE, new String[] {ID, NAME, PHONE, EMAIL, ADDRESS, /*IMAGEURI*/}, ID + "=?", new String[] {String.valueOf(id)},null,null,null,null );

    if (cursor != null)
        cursor.moveToFirst();

    ContactList contact = new ContactList(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), Uri.parse(cursor.getString(5)));
    db.close();
    cursor.close();
    return contact;
}

//CRUD: UPDATE

public int updateContact(ContactList contact){
    SQLiteDatabase db = getWritableDatabase();

    ContentValues values = new ContentValues();

    values.put(NAME, contact.getName());
    values.put(PHONE, contact.getPhone());
    values.put(EMAIL, contact.getEmail());
    values.put(ADDRESS, contact.getAddress());
    values.put(IMAGEURI, contact.getImageUri().toString());

    return db.update(TABLE, values, ID + "=?", new String[] { String.valueOf(contact.getId()) });
}

//CRUD: DELETE

public void deleteContact(ContactList contact){
    SQLiteDatabase db = getWritableDatabase();

    db.delete(TABLE, ID + "=?", new String[] {String.valueOf(contact.getId())});
    db.close();
}

public int getContactsCount(){
    SQLiteDatabase db = getReadableDatabase();

    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE, null);
    int count = cursor.getCount();
    db.close();
    cursor.close();
    return count;
}

public List<ContactList> getAllContacts(){
    List<ContactList> contacts = new ArrayList<ContactList>();

    SQLiteDatabase db = getWritableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE, null);

    if(cursor.moveToFirst()){
        do {
            ContactList contact = new ContactList(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), Uri.parse(cursor.getString(5)));
            contacts.add(contact);
        }
        while (cursor.moveToNext());
    }
    return contacts;
}
}
我对其他陈述有异议


我能做些什么来解决这个问题?请帮帮我

首先,必须在每个列名及其类型之间放置空格:

db.execSQL("CREATE TABLE " + TABLE + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + NAME + " TEXT," + PHONE + " TEXT," + EMAIL + " TEXT," + ADDRESS + " TEXT," + IMAGEURI + " TEXT " + ")");
第二,在光标中:

Cursor cursor = db.query(TABLE, new String[] {ID, NAME, PHONE, EMAIL, ADDRESS, /*IMAGEURI*/}, ID + "=?", new String[] {String.valueOf(id)},null,null,null,null );
您编写了
/*IMAGEURI*/
!因此,一些行之后,
cursor.getString(5)
不存在是正常的,它也会崩溃:

ContactList contact = new ContactList(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), Uri.parse(cursor.getString(5)));
最后,确保您的数据模型已更新。
如果在以前的调试会话中创建数据库时添加imageUri列,它将崩溃。您很好地重写了
onUpgrade
方法来删除现有表,但我希望您不要忘记也增加数据库版本值;-)

首先,必须在每个列名及其类型之间放置空格:

db.execSQL("CREATE TABLE " + TABLE + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + NAME + " TEXT," + PHONE + " TEXT," + EMAIL + " TEXT," + ADDRESS + " TEXT," + IMAGEURI + " TEXT " + ")");
第二,在光标中:

Cursor cursor = db.query(TABLE, new String[] {ID, NAME, PHONE, EMAIL, ADDRESS, /*IMAGEURI*/}, ID + "=?", new String[] {String.valueOf(id)},null,null,null,null );
您编写了
/*IMAGEURI*/
!因此,一些行之后,
cursor.getString(5)
不存在是正常的,它也会崩溃:

ContactList contact = new ContactList(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), Uri.parse(cursor.getString(5)));
最后,确保您的数据模型已更新。
如果在以前的调试会话中创建数据库时添加imageUri列,它将崩溃。您很好地重写了
onUpgrade
方法来删除现有表,但我希望您不要忘记也增加数据库版本值;-)

首先,必须在每个列名及其类型之间放置空格:

db.execSQL("CREATE TABLE " + TABLE + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + NAME + " TEXT," + PHONE + " TEXT," + EMAIL + " TEXT," + ADDRESS + " TEXT," + IMAGEURI + " TEXT " + ")");
第二,在光标中:

Cursor cursor = db.query(TABLE, new String[] {ID, NAME, PHONE, EMAIL, ADDRESS, /*IMAGEURI*/}, ID + "=?", new String[] {String.valueOf(id)},null,null,null,null );
您编写了
/*IMAGEURI*/
!因此,一些行之后,
cursor.getString(5)
不存在是正常的,它也会崩溃:

ContactList contact = new ContactList(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), Uri.parse(cursor.getString(5)));
最后,确保您的数据模型已更新。
如果在以前的调试会话中创建数据库时添加imageUri列,它将崩溃。您很好地重写了
onUpgrade
方法来删除现有表,但我希望您不要忘记也增加数据库版本值;-)

首先,必须在每个列名及其类型之间放置空格:

db.execSQL("CREATE TABLE " + TABLE + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + NAME + " TEXT," + PHONE + " TEXT," + EMAIL + " TEXT," + ADDRESS + " TEXT," + IMAGEURI + " TEXT " + ")");
第二,在光标中:

Cursor cursor = db.query(TABLE, new String[] {ID, NAME, PHONE, EMAIL, ADDRESS, /*IMAGEURI*/}, ID + "=?", new String[] {String.valueOf(id)},null,null,null,null );
您编写了
/*IMAGEURI*/
!因此,一些行之后,
cursor.getString(5)
不存在是正常的,它也会崩溃:

ContactList contact = new ContactList(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), Uri.parse(cursor.getString(5)));
最后,确保您的数据模型已更新。

如果在以前的调试会话中创建数据库时添加imageUri列,它将崩溃。您很好地重写了
onUpgrade
方法来删除现有表,但我希望您不要忘记也增加数据库版本值;-)

如果一段时间后添加了ImageUri,则可能需要迁移数据库。因此,请尝试卸载你的应用程序,然后重新安装。我已经卸载了我的应用程序,但reult是相同的。如果你在一段时间后添加了ImageUri,你可能需要迁移数据库。因此,请尝试卸载你的应用程序,然后重新安装。我已经卸载了我的应用程序,但reult是相同的。如果你在一段时间后添加了ImageUri,你可能需要迁移数据库。因此,请尝试卸载你的应用程序,然后重新安装。我已经卸载了我的应用程序,但reult是相同的。如果你在一段时间后添加了ImageUri,你可能需要迁移数据库。因此,请尝试卸载你的应用程序,然后重新安装。我一直在卸载我的应用程序,但结果是相同的。我尝试在我的模拟器上“清除数据”,并从模拟器中卸载我的应用程序,但结果没有改变。每次运行应用程序时,我都会手动更改数据库的数据版本。我不知道如何解决这个问题。。我还可以做什么?您是否做了我建议您首先做的代码修改?我取消了IMAGEURI的注释,并重写了onUpgrade方法。我不明白,如果我运行应用程序,数据库应该通过onUpgrade方法删除,并使用正确的列数重新创建??如果我卸载并重新安装android studio,并启动一个新项目,然后手动复制代码,我可以修复此问题?不,onUpgrade不会自动删除您的数据库!您必须先“+1”您的
DB_版本
int,安装/重新安装Android studio以防出现此类错误绝对是矫枉过正和无用的;-)我试图在模拟器上“清除数据”,并从模拟器上卸载了我的应用程序,但结果没有改变。每次运行应用程序时,我都会手动更改数据库的数据版本。我不知道如何解决这个问题。。我还可以做什么?您是否做了我建议您首先做的代码修改?我取消了IMAGEURI的注释,并重写了onUpgrade方法。我不明白,如果我运行应用程序,数据库应该通过onUpgrade方法删除,并使用正确的列数重新创建??如果我卸载并重新安装android studio,并启动一个新项目,然后手动复制代码,我可以修复此问题?不,onUpgrade不会自动删除您的数据库!您必须先“+1”您的
DB_版本
int,安装/重新安装Android studio以防出现此类错误绝对是矫枉过正和无用的;-)我试图在模拟器上“清除数据”,并从模拟器上卸载了我的应用程序,但结果没有改变。每次运行应用程序时,我都会手动更改数据库的数据版本。我不知道如何解决这个问题。。我还可以做什么?您是否做了我建议您首先做的代码修改?我取消了IMAGEURI的注释,并重写了onUpgrade方法。我不明白,如果我运行应用程序,数据库应该用onUpgrade方法删除,并用正确的列数重新创建??如果我是uni