【问题标题】:Strange error with SQLite extending SQLiteOpenHelperSQLite 扩展 SQLiteOpenHelper 的奇怪错误
【发布时间】:2018-06-02 00:23:42
【问题描述】:

我创建了一个扩展 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"));

【问题讨论】:

标签: java android sqlite


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复,我找到了数据库文件夹,但是当我单击删除按钮或单击红色减号时,没有任何反应。我错过了一些明显的东西吗哈哈?
  • 没关系,我删除了文件夹中的内容
  • 你需要在database文件夹上right-click然后点击delete选项但是如果你已经删除了数据库文件夹的内容,它也可以工作
  • 所以我这样做了,重试并得到同样的错误。我已经提取了数据库文件,往里面看,可以看到正在创建的标题字段。这很令人困惑:S您还有其他建议吗?谢谢
  • 没关系,再试一次,这次成功了。也许我看了一个旧日志。我会赞成你的回答。再次感谢您的帮助
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多