2014-01-12 263 views
1

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

请求你们帮我找出错误。 在此先感谢。

+1

卸载应用程序,以便任何旧版本的数据库文件被删除。 – laalto

+0

如何和应用程序可以从模拟器中卸载? – Saggy

+0

在设置中使用应用程序管理器,或在命令行中使用'adb卸载'。 – laalto

回答

2

SQLiteOpenHelperonCreate()仅在数据库文件不存在时才被调用。如果您修改了onCreate()中的SQL,则必须确保数据库文件已更新。

两种方法:

  • 删除旧版本的数据库。卸载是这样做的一种方法。这样数据库就可以用您目前在onCreate()中的任何代码来创建。这通常是应用程序开发过程中最简单的方法。

  • 将您传递给SQLiteOpenHelper超类的数据库版本号弄糟。如果此编号与存储在数据库文件中的版本编号不同,则调用onUpgrade()onDowngrade(),您可以更新数据库模式。这是您已经发布版本的首选方式,因此用户在更新应用时可以保留其数据。

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); 

} 
+1

因为onUpgrade()没有被执行,所以不起作用。 – laalto

+0

@ramaral:我一次创建了所有的字段。创建后未更改。 – Saggy

+0

您是否更改过KEY_PRICE列名称? – ramaral

2

从终端

adb shell 
cd /data/data/com.example.applicationname/databases 
rm * 

删除数据库首先,你创建的表Booksx的列数,但列并没有被包括在创建表的查询。稍后,您将此列名添加到您的创建表查询中。 这就是为什么发生这个问题。

尝试删除数据库。它会从应用程序中删除旧的数据库,当您重新启动时,将创建新的数据库。 onCreate()仅在您的数据库不存在时才会调用

-1

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