我正在创建一个简单的数据库来添加产品的价值。在数据库中添加条目时,我在Logcat中收到错误,然后程序停在那里。
我不清楚错误,但它与插入数据有关或在我写的查询中。我尝试了所有可能的替代方案。
程序代码是:
DataBase.java
public class DataBase extends SQLiteOpenHelper
{
public DataBase(Context context) {
super(context, CreateTable.DB_NAME, null, CreateTable.DB_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String create = "Create Table " + CreateTable.TABLE_NAME + "( " + CreateTable.KEY_ID
+ " INTEGER PRIMARY KEY," + CreateTable.KEY_NAME + " TEXT,"
+ CreateTable.KEY_PRICE + " REAL)";
db.execSQL(create);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
public void addProduct(Product p)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues c = new ContentValues();
c.put(CreateTable.KEY_NAME, p.getName());
c.put(CreateTable.KEY_PRICE, p.getPrice());
db.insert(CreateTable.TABLE_NAME, null, c);
db.close();
}
}
EnterDeatils.java
public class EnterDeatils extends Activity {
EditText name;
EditText price;
Button done;
int id = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.enter_deatils);
name = (EditText) findViewById(R.id.edtname);
price = (EditText) findViewById(R.id.edtprice);
done = (Button) findViewById(R.id.btndone);
done.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Product p = new Product();
p.setId(id);
p.setName(name.getText().toString());
p.setPrice(Float.valueOf(price.getText().toString()));
DataBase d = new DataBase(EnterDeatils.this);
d.addProduct(p);
}
});
}
}
LogCat错误:
01-12 23:06:52.343: E/Database(382): Error inserting pPrice=12.0 pName=ds
01-12 23:06:52.343: E/Database(382): android.database.sqlite.SQLiteException: table Books has no column named pPrice: , while compiling: INSERT INTO Books(pPrice, pName) VALUES(?, ?);
请求你们帮我识别错误。 在此先感谢。
答案 0 :(得分:2)
SQLiteOpenHelper
onCreate()
。如果在onCreate()
中修改SQL,则必须确保更新数据库文件。
两种方法:
删除旧版本的数据库。卸载是一种方法。这样,数据库就可以使用onCreate()
中当前的代码创建。这通常是应用程序开发过程中最简单的方法。
将您传递给SQLiteOpenHelper
超类的数据库版本号Bump。如果此数字与存储在数据库文件中的版本号不同,则会调用onUpgrade()
或onDowngrade()
,您可以更新数据库架构。当您已经发布版本时,这是首选方式,这样您的用户可以在更新应用时保留其数据。
答案 1 :(得分:2)
从终端删除您的数据库
adb shell
cd /data/data/com.example.applicationname/databases
rm *
首先,您创建的表Books
列数为x
,但该创建表查询中未包含pPrice
列。稍后,您将此列名添加到create table查询中。
这就是发生这个问题的原因。
尝试删除数据库。它将从应用程序中删除旧数据库,并在您重新启动时创建新数据库。
仅当您的数据库不存在时才会调用onCreate()
答案 2 :(得分:1)
似乎您的数据库是在没有列KEY_PRICE
的情况下创建的
之后,您更改了将KEY_PRICE
列添加到String create
的代码。
如果是这样,您必须增加数据库版本才能再次创建:
变化:
CreateTable.DB_VERSION = 1;
要
CreateTable.DB_VERSION = 2;
由于laalto建议更改onUpgrade
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + CreateTable.TABLE_NAME);
onCreate(db);
}
答案 3 :(得分:-1)
检查您是否遗漏了一些空间。我有同样的问题,并通过添加空间来解决......