2011-11-14 91 views
0

我有問題插入到我的應用程序中的SQLite數據庫。每當我嘗試插入數據,我得到以下錯誤:android.database.sqlite.SQLiteException:表tblstudents沒有列名鎮。我試過翻看代碼,但我不明白是什麼導致了這個錯誤。我的代碼如下:Android的SQLite數據庫列錯誤

package com.StudentTracker; 
import java.sql.Blob; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 


public class DBAdapter { 

    public static final String KEY_ROWID = "id"; 
    public static final String KEY_STUDENTNAME = "studentname"; 
    public static final String KEY_DOB = "dob"; 
    public static final String KEY_ADDRESS1 = "address1"; 
    public static final String KEY_ADDRESS2 = "address2"; 
    public static final String KEY_TOWN = "town"; 
    public static final String KEY_POSTCODE = "postcode"; 
    public static final String KEY_PHONE = "phone"; 
    public static final String KEY_STUDENT_PIC = "studentpic"; 

    private static final String TAG = "DBAdapter"; 



    private static final String DATABASE_NAME = "studentDB2"; 
    private static final String DATABASE_TABLE = "tblstudents"; 
    private static final int DATABASE_VERSION = 1; 

    private static final String DATABASE_CREATE = 
     "create table tblstudents (id integer primary key autoincrement, " 
     + "studentname text not null, dob text not null, " 
     + "address1 text not null, address2 text not null, " 
     + "town text not null, postcode text not null, " 
     + " phone text not null);"; 

    private final Context context; 

    private DatabaseHelper DBHelper; 
    private SQLiteDatabase db; 

    public DBAdapter(Context ctx) 
    { 
     this.context = ctx; 
     DBHelper = new DatabaseHelper(context); 
    } 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
      db.execSQL(DATABASE_CREATE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, 
     int newVersion) 
     { 
      Log.w(TAG, "Upgrading database from version " + oldVersion 
        + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS studentDB2"); 
      onCreate(db); 
     } 
    }  

    //---opens the database--- 
    public DBAdapter open() throws SQLException 
    { 
     db = DBHelper.getWritableDatabase(); 
     return this; 
    } 

    //---closes the database---  
    public void close() 
    { 
     DBHelper.close(); 
    } 

    //---insert a title into the database--- 
    public long insertStudent(String studentname, String dob, String address1, String address2, String town, String postcode, String phone) 
    { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_STUDENTNAME, studentname); 
     initialValues.put(KEY_DOB, dob); 
     initialValues.put(KEY_ADDRESS1, address1); 
     initialValues.put(KEY_ADDRESS2, address2); 
     initialValues.put(KEY_TOWN, town); 
     initialValues.put(KEY_POSTCODE, postcode); 
     initialValues.put(KEY_PHONE, phone); 
     //initialValues.put(KEY_STUDENT_PIC, studentpic); 

     return db.insert(DATABASE_TABLE, null, initialValues); 
    } 

    //---deletes a particular title--- 
    public boolean deleteTitle(long rowId) 
    { 
     return db.delete(DATABASE_TABLE, KEY_ROWID + 
       "=" + rowId, null) > 0; 
    } 

    //---retrieves all the titles--- 
    public Cursor getAllStudents() 
    { 
     return db.query(DATABASE_TABLE, new String[] { 
       KEY_ROWID, 
       KEY_STUDENTNAME, 
       KEY_DOB, 
       KEY_ADDRESS1, 
       KEY_ADDRESS2, 
       KEY_TOWN, 
       KEY_POSTCODE, 
       KEY_PHONE 
          }, 
       null, 
       null, 
       null, 
       null, 
       null); 
    } 

    //---retrieves a particular title--- 
    public Cursor getStudent(long rowId) throws SQLException 
    { 
     Cursor mCursor = 
       db.query(true, DATABASE_TABLE, new String[] { 
         KEY_ROWID, 
         KEY_STUDENTNAME, 
         KEY_DOB, 
         KEY_ADDRESS1, 
         KEY_ADDRESS2, 
         KEY_TOWN, 
         KEY_POSTCODE, 
         KEY_PHONE     
         }, 
         KEY_ROWID + "=" + rowId, 
         null, 
         null, 
         null, 
         null, 
         null); 
     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 
     return mCursor; 
    } 

    //---updates a title--- 
    public boolean updateStudent(long rowId, String studentname, 
    String dob, String address1, String address2, String town, 
    String postcode, String phone) 
    { 
     ContentValues args = new ContentValues(); 
     args.put(KEY_STUDENTNAME, studentname); 
     args.put(KEY_DOB, dob); 
     args.put(KEY_ADDRESS1, address1); 
     args.put(KEY_ADDRESS2, address2); 
     args.put(KEY_TOWN, town); 
     args.put(KEY_POSTCODE, postcode); 
     args.put(KEY_PHONE, phone); 
     //args.put(KEY_STUDENT_PIC, studentpic); 

     return db.update(DATABASE_TABLE, args, 
         KEY_ROWID + "=" + rowId, null) > 0; 
    } 




} 
+2

你試過刪除你的SQLite數據庫並重新創建它嗎? – fonini

+0

你有沒有嘗試清潔和重建你的項目? – Hiral

回答

0

如果您最近添加了該列,請記住,以便在升級程序被執行以增加數據庫的版本也是如此。

+1

這行可能會失敗:db.execSQL(「DROP TABLE IF EXISTS studentDB2」);我想「studentDB2」是數據庫,而不是表格 – fonini

1

您應該將表tblstudents放在OnUpgrade()而不是studentDB2表中。

db.execSQL("DROP TABLE IF EXISTS tblstudents"); 

不要忘記增加DATABASE_VERSION的數量。否則,OnUpgrade()將不會被調用。

private static final int DATABASE_VERSION = 2; 
0
public class DBaseHelper extends SQLiteOpenHelper { 
private final static int DB_VERSION = 2; 

//檢查^^數據庫版本是一個新的值(遞增),一個

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


@Override 
public void onCreate(SQLiteDatabase db) { 
    final String DATABASE_CREATE = 
     "create table tblstudents (id integer primary key autoincrement, " 
     + "studentname text not null, dob text not null, " 
     + "address1 text not null, address2 text not null, " 
     + "town text not null, postcode text not null, " 
     + " phone text not null);"; 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion < 2) { 
     final String ALTER_TBL = 
      "ALTER TABLE " + TABLE_NAME + 
      " ADD COLUMN town text not null;"; 
     db.execSQL(ALTER_TBL); 
    } 
} 
} 

一旦你增加的版本號,它會發出信號數據庫建設者瞭解onCreate方法中的create table語句。一旦它看到新的或任何類型的差異,它會轉到onUpgrade方法,並運行代碼以使其正常工作,幷包含表列。