【问题标题】:SQLite - no such columnSQLite - 没有这样的列
【发布时间】:2014-08-25 08:02:39
【问题描述】:

我想预先填充数据库并简单地检索数据。这是一个时间表,(目前)获取数据并将其放入 3 列。活动名称、日期和地点。

我可以成功检索到 ID 号,即 PK 和活动名称,但应用程序在面对列日时关闭。

这是我收到的 logcat 错误:

Caused by: android.database.sqlite.SQLiteException: no such column: day (code 1): , while compiling: SELECT _id, activity, day, location FROM TrainingTable

我将包含我的代码,看看是否有我遗漏的明显错误:

public class Training_table {

//setting up rows
public static final String KEY_ROWID = "_id";//creates a row ID variable
public static final String KEY_ACTIVITY = "activity";
public static final String KEY_DAY = "day";
public static final String KEY_LOCATION = "location";

//setting up database as private so only this class can ac
private static final String DATABASE_TABLE = "TrainingTable";
private static final int DATABASE_VERSION = 2;//db version

//setup db and setup subclass and use dbHelper to setup db

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;



private static class DbHelper extends SQLiteOpenHelper{


    public DbHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);//passing info into super class
    }

    //exe SQL code to create a table & three columns
    //only time this onCreate method is called is first time we create db

    /*@Override
    public void onCreate(SQLiteDatabase db) {


    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_ACTIVITY + " TEXT NOT NULL, " + KEY_DAY + " TEXT NOT NULL, " +
                KEY_LOCATION + " TEXT NOT NULL);"
        );//Execute Database and create table


    }//onCreate method


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

    }
}

public  Training_table(Context c){
    ourContext = c;
}//constructor (initialising context)



//openMethod & write to it
public Training_table open(){

    ourHelper = new DbHelper(ourContext);

    ourDatabase = ourHelper.getWritableDatabase();
    return  this;
}
//close SQLiteOpenHelper
public void close(){
    ourHelper.close();
}
public void deleteTable(){
    ourDatabase.delete(DATABASE_TABLE, null, null);
}

   public long newEntry(String theActivity, String theDay, String theLocation) {
   // TODO Auto-generated method stub
   ContentValues values = new ContentValues();
   values.put(KEY_ACTIVITY, theActivity);
   values.put(KEY_DAY, theDay);
   values.put(KEY_LOCATION, theLocation);
   return ourDatabase.insert(DATABASE_TABLE, null, values);
   }


   public String getData() { //CREATING getData() method
   String[] columns = new String[] {KEY_ROWID, KEY_ACTIVITY, KEY_DAY, KEY_LOCATION}; /*Setting up column array,
                                                    holding all fields*/
   Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); //initialising the cursor
   String result = "";

    /*Setting up a few int's below, to hold the column location of the activity,
    day and location within the database */
   int indexActivity = c.getColumnIndex(KEY_ACTIVITY);
   int indexDay = c.getColumnIndex(KEY_DAY);
   int indexLocation = c.getColumnIndex(KEY_LOCATION);

   for (c.moveToLast(); !c.isAfterLast(); c.moveToNext()){

       //Getting all values below
       result = c.getString(indexActivity);
       result = result + " " + c.getString(indexDay) + " " + c.getString(indexLocation);
   }
   c.close(); //Closing the cursor
   return result;
   }


}//RaceRating class (DB Class)

这是调用方法的java类:

public class Training_table_view extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.training_table_view);

    TextView tv = (TextView)findViewById(R.id.tvTTinfo);//setting up reference
    //Button bv = (Button)findViewById(R.id.bViewDetails);

    String act = "Swimming";
    String day = "Mon";
    String loc = "bfast";

    Training_table info = new Training_table(this);//create training table

    info.open();//open Training table  class
    info.deleteTable();

    //info.insertRecord1();
    info.newEntry(act,day,loc);

    String data = info.getData();//return string from get data method

    info.close();

    tv.setText(data);//set text view to the string we got data from


}//onCreate


}//Training_table_view class

【问题讨论】:

  • 如果您在运行应用程序后一天后添加了列,请尝试清除数据,然后在设备中重新安装应用程序
  • 我确实在后期添加了一天,如何清除数据?
  • 在设置>应用程序管理器/管理应用程序>您的应用程序的名称。在那里你会看到清除数据的按钮。
  • 尝试将 day 列重命名为 _day 或其他任何内容

标签: android database sqlite insert


【解决方案1】:
Caused by: android.database.sqlite.SQLiteException: no such column: day (code 1): , while compiling: SELECT _id, activity, day, location FROM TrainingTable

您可能在后期添加了列day(即之前运行的应用程序)

您需要清除您的应用程序的数据,重新安装并再次检查。

打开设备设置 > 应用程序管理器/管理应用程序 > YourAppName。

在这里你会找到一个清除数据的按钮,然后卸载。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    请先解释一下

    info.open();//open Training table  class
        info.deleteTable();
    

    你是在创建一个表后删除你的表吗?为什么?

    其次尝试将KEY_DAY的字段重命名为_day之类的

     public static final String KEY_DAY = "_day";
    
    @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
                    KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    KEY_ACTIVITY + " TEXT NOT NULL, " + 
                    KEY_DAY + " TEXT NOT NULL, " +
                    KEY_LOCATION + " TEXT NOT NULL " + ");";
            );//Execute Database and create table
    

    同时从 oncreate 和 onupgrade 方法中移除 cmets。

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 2020-06-02
      • 2020-08-16
      • 2017-02-09
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多