【问题标题】:I get FATAL EXCEPTION: table cars has no column named year我得到 FATAL EXCEPTION: table cars 没有名为 year 的列
【发布时间】:2012-07-27 06:20:06
【问题描述】:

谁能找到我得到这个错误的原因吗?有人可以帮忙吗?

package Android.data;

public class CarsDbConstants 
{

public static final String DATABASE_NAME = "cars.db";

public static final int DATABASE_VERSION = 1;
public static final String CARS_TABLE_NAME = "cars";

public static final String CAR_ID = "_id";
public static final String CAR_MANUFACTURER = "manufacturer";
public static final String CAR_YEAR= "year";
public static final String LOG_TAG = "CarsDb";

}

package Android.data;

public class CarsDBHelper extends SQLiteOpenHelper 
{
 public CarsDBHelper(Context context, String name, CursorFactory factory,
        int version)
{
    super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db) 
{
    Log.d(LOG_TAG, "Creating all the tables");

    String CREATE_CARS_TABLE = 
            "CREATE TABLE " + CARS_TABLE_NAME + 
       "("  + CAR_ID + " INTEGER PRIMARY KEY,"
            + CAR_MANUFACTURER + " TEXT,"
            + CAR_YEAR + " INTEGER"+")";
    try 
    {
        db.execSQL(CREATE_CARS_TABLE);
    }
    catch (SQLiteException ex)
    {
        Log.e(LOG_TAG, "Create table exception: " + ex.getMessage());
    }
}
  }

   public void addCar(Cars car)
    {
        db = dbhelper.getWritableDatabase();

        ContentValues newCarValues = new ContentValues();
        //newCarValues.put(CAR_ID,car.get_id());
        newCarValues.put(CAR_MANUFACTURER, car.getManufacturer());
        newCarValues.put(CAR_YEAR, car.getYear());


        // Inserting the new row, or throwing an exception if an error occurred
        try
        {
            db.insertOrThrow(CARS_TABLE_NAME, null, newCarValues);
        }
        catch (SQLiteException ex)
        {
            Log.e(LOG_TAG, ex.getMessage());
            throw ex;
        }   
        finally
        {
            db.close();
        }
    }

     package Android.hwsqldb;

     public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    CarsHandler db = new CarsHandler(this);
    insertCars(db);
    Cursor cursor = db.getAllCars();
    this.startManagingCursor(cursor);
    showCars(cursor);
}



private void showCars(Cursor c) {
    Log.d("Reading:", "Reading all cars");

    ArrayList<String> items = new ArrayList<String>();

    while (c.moveToNext()) {
        items.add(String.format("%s: %s\n\t%s, %s",
                c.getInt(c.getColumnIndex(CAR_ID)),
                c.getString(c.getColumnIndex(CAR_MANUFACTURER)),
                c.getInt(c.getColumnIndex(CAR_YEAR))));
    }

    ListView lv = (ListView) findViewById(R.id.listView1);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, items);
    lv.setAdapter(adapter);
}





private void insertCars(CarsHandler db) 
{
    Log.d("Inserting:", "Inserting cars to DB");

    db.addCar(new Cars(1,"Subaru", 1987));
    db.addCar(new Cars(2,"Fiat", 1921));
    db.addCar(new Cars(3,"Susita", 1956));
    db.addCar(new Cars(4,"Mesrsedes", 1923));   
}

抛出错误:

07-29 07:08:47.315: E/AndroidRuntime(1165): FATAL EXCEPTION: main

07-29 07:08:47.315: E/AndroidRuntime(1165): java.lang.RuntimeException: Unable to start activity ComponentInfo{Android.hwsqldb/Android.hwsqldb.MainActivity}: java.util.MissingFormatArgumentException: Format specifier: s

创建的数据库表包含所有数据。

【问题讨论】:

  • 创建的表是否包含年份列,可以在shell中查看
  • @llazar1x 您在 add() 中发送了 3 个参数,并且您在 add() 函数中对 id 参数给出了评论。另一件事您可以检查您的数据库是否在您的 DDMS >文件中创建资源管理器 > 数据 > 数据 > 你的 pkg 名称

标签: android sqlite error-handling


【解决方案1】:

public static final String CAR_YEAR="year";

您可以更改列名称,如

public static final String CAR_YEAR="_year";

然后测试您的代码并检查是否从 android DDMS 文件资源管理器创建了数据库和表。

你的代码块 ::

@覆盖 公共无效 onCreate(Cdb) { Log.d(LOG_TAG, "创建所有表");

这个参数 'SQLiteDatabase db' 是什么。接受将 SQLiteDatabase 参数传递给 onCreate() 方法。

你可以调用 SQLiteDatabase 类。

SQLiteDatabase db = new SQLiteDatabase() into onCreate() 方法

【讨论】:

  • 试过了...创建并填充了所有列。下一个作品意味着什么:public void onCreate(SQLiteDatabase db) 和
  • 试过了...创建并填充了所有列。什么意味着在 onCreate() 中创建表并用 insertCars(CarsHandler db) 中的数据填充它是有效的....那么为什么会出现错误?
猜你喜欢
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2016-07-14
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
相关资源
最近更新 更多