将值插入数据库时​​出错

时间:2014-01-12 17:55:35

标签: android sqlite

我正在创建一个简单的数据库来添加产品的价值。在数据库中添加条目时,我在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(?, ?);

请求你们帮我识别错误。 在此先感谢。

4 个答案:

答案 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)

检查您是否遗漏了一些空间。我有同样的问题,并通过添加空间来解决......