java - SQLite 扩展 SQLiteOpenHelper 的奇怪错误

标签 java android sqlite

我创建了一个扩展 SQLiteOpenHelper 类的类,并尝试创建一个数据库并在我的 Android 应用启动时插入一条虚拟记录。

但是我收到错误“表格​​库没有名为标题的列”。

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

错误:

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)

我创建的扩展 SQLiteOpenHelper 的类:

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"));

最佳答案

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

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

要删除现有数据库,请转至 Android Device Monitor -> data -> data,然后搜索应用的包名称。单击您的应用程序包名称,然后删除其中的 database 文件夹,然后再次运行您的应用程序。

关于java - SQLite 扩展 SQLiteOpenHelper 的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47889140/

相关文章:

java - 带有抽屉导航的可滑动面板(如动画)

android - TELEPHONY_SERVICE1 和 TELEPHONY_SERVICE 之间有什么区别

php - 使用 mysql 数据库中的数据过滤 ListView

java - Android SQLite 从 fragment 调用数据库

google-chrome - Chrome将SQLite数据库文件保存在哪里,它会将存储的密码等内容写入其中?

android - 从 Android 服务中打开数据库连接时出错

java - Eclipse 和 Scala 中的 Maven pom 错误

java - 使用 Internet Explorer 11 运行 64 位 Java

java - 在所有方法调用上允许类型见证有什么意义?

android - 在 Phonegap 3 文件夹结构中从哪里开始