Java SQLite扩展SQLiteOpenHelper时出现奇怪错误

Java SQLite扩展SQLiteOpenHelper时出现奇怪错误,java,android,sqlite,Java,Android,Sqlite,我创建了一个类,它扩展了SQLiteOpenHelper类,并试图在Android应用程序启动时创建一个DB和插入一个虚拟记录 但是,我收到一个错误“TableGallery没有名为title的列” 其他列没有抛出错误,它们都是以相同的方式创建的 错误: 12-19 14:24:30.401 4801-4807/? E/art: Failed sending reply to debugger: Broken pipe 12-19 14:24:30.808 4801-4801/? E/SQLit

我创建了一个类,它扩展了SQLiteOpenHelper类,并试图在Android应用程序启动时创建一个DB和插入一个虚拟记录

但是,我收到一个错误“TableGallery没有名为title的列”

其他列没有抛出错误,它们都是以相同的方式创建的

错误:

12-19 14:24:30.401 4801-4807/? E/art: Failed sending reply to debugger: Broken pipe
12-19 14:24:30.808 4801-4801/? E/SQLiteLog: (1) table gallery has no column named title
12-19 14:24:30.810 4801-4801/? E/SQLiteDatabase: Error inserting title=First pic artist=James Liscombe rank=3 year=1992
                                                 android.database.sqlite.SQLiteException: table gallery has no column named title (code 1): , while compiling: INSERT INTO gallery(title,artist,rank,year) VALUES (?,?,?,?)
                                                     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.insertWithOnConflict(SQLiteDatabase.java:1469)
                                                     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
                                                     at com.example.jamesliscombe.cet325assignment.DBHandler.addPicture(DBHandler.java:59)
                                                     at com.example.jamesliscombe.cet325assignment.Home.onCreate(Home.java:35)
                                                     at android.app.Activity.performCreate(Activity.java:6237)
                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                     at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                     at android.os.Looper.loop(Looper.java:148)
                                                     at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

您的设备中已经安装了一个不包含
title
列的数据库,因此当您尝试添加带有
title
列值的虚拟数据时,您会收到错误

可以通过删除已创建的旧数据库,然后再次运行应用程序以创建新数据库来解决此问题


要删除现有数据库,请转到
Android设备监视器->数据->数据
,然后搜索应用程序的软件包名称。单击应用程序的软件包名称,然后删除其中的
数据库
文件夹,然后再次运行应用程序。

在“标题”(KEY_title)和“文本”之间缺少一个空格。感谢您的回复,我找到了数据库文件夹,但是当我单击删除按钮或单击红色减号时,什么也没有发生。我是不是遗漏了一些明显的东西哈哈?没关系,我删除了文件夹中的内容,而不是你需要在
数据库
文件夹上
右键单击
,然后单击
删除
选项,但是如果你删除了数据库文件夹的内容,它将正常工作,所以我这样做了,重试并得到相同的错误。我提取了数据库文件,查看了内部,可以看到正在创建的标题字段。这很令人困惑:S你还有其他建议吗?谢天谢地,再试一次,这次成功了。也许我看过一根旧木头。我将投票赞成你的回答。再次感谢你的帮助
public class DBHandler extends SQLiteOpenHelper {

//DB Info
private static final int DB_VERSION = 2;
private static final String DB_NAME = "louvre";
private static final String TABLE_NAME = "gallery";

//Table column names
private static final String KEY_ID = "id";
private static final String KEY_RANK = "rank";
private static final String KEY_ARTIST = "artist";
private static final String KEY_TITLE = "title";
private static final String KEY_YEAR = "year";

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

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_GALLERY_TABLE = "CREATE TABLE " + TABLE_NAME + "("
            + KEY_ID + "INTEGER PRIMARY KEY," + KEY_RANK + "INTEGER,"
            + KEY_ARTIST + "TEXT," + KEY_TITLE + "TEXT," + KEY_YEAR + "TEXT" + ")";
    db.execSQL(CREATE_GALLERY_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //Drop older table if it exists
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    //Create table again
    onCreate(db);
}

//Adding a new gallery record
public void addPicture(Picture picture) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_RANK, picture.getRank());
    values.put(KEY_ARTIST, picture.getArtist());
    values.put(KEY_TITLE, picture.getTitle());
    values.put(KEY_YEAR, picture.getYear());
    //Insert row
    db.insert(TABLE_NAME, null, values);
    //Close db connection
    db.close();
}

//Reading a single record
public Picture getPicture(int id) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_NAME, new String[] {
        KEY_ID,KEY_RANK,KEY_ARTIST,KEY_TITLE,KEY_YEAR
    },KEY_ID + "=?", new String[] {
            String.valueOf(id) }, null, null, null, null);

    if (cursor != null) {
        cursor.moveToFirst();
    }
    Picture contact = new Picture(Integer.parseInt(cursor.getString(0)),Integer.parseInt(cursor.getString(1)),cursor.getString(2),cursor.getString(3), cursor.getString(4));
    return contact;
}

//Reading all records
public List<Picture> getAllPictures() {
    List<Picture> galleryList = new ArrayList<Picture>();
    //Select all query
    String selectQuery = "SELECT * FROM " + TABLE_NAME;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    //Loop through all rows and add to galleryList.
    if(cursor.moveToFirst()) {
        do {
            Picture picture = new Picture();
            picture.setId(Integer.parseInt(cursor.getString(0)));
            picture.setRank(Integer.parseInt(cursor.getString(1)));
            picture.setArtist(cursor.getString(2));
            picture.setTitle(cursor.getString(3));
            picture.setYear(cursor.getString(4));
            galleryList.add(picture);
        } while (cursor.moveToNext());
    }
    return galleryList;
}

//Get total number of records
public int getGallerySize() {
    String countQuery = "SELECT * FROM " + TABLE_NAME;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    cursor.close();
    return cursor.getCount();
}

//Update gallery items
public int updateGallery(Picture picture) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_RANK, picture.getRank());
    values.put(KEY_ARTIST, picture.getArtist());
    values.put(KEY_TITLE, picture.getTitle());
    values.put(KEY_YEAR, picture.getYear());

    return db.update(TABLE_NAME, values, KEY_ID + " = ?", new String[]{String.valueOf(picture.getId())});
}

//Delete a gallery record
public void deletePicture(Picture picture) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_NAME, KEY_ID + " = ?", new String[] {String.valueOf(picture.getId())});
    db.close();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    //Create our DB
    DBHandler db = new DBHandler(this);

    //Insert some test data into our db
    db.addPicture(new Picture(1,3,"James","First pic","1992"));