2014-01-12 4 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(); 
    } 

} 

에게

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

} 

로그 캣 오류 EnterDeatils.java :

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 uninstall '을 사용하십시오. – laalto

답변

2

SQLiteOpenHelperonCreate()은 데이터베이스 파일이없는 경우에만 호출됩니다. onCreate()에서 SQL을 수정하는 경우 데이터베이스 파일이 업데이트되었는지 확인해야합니다.

두 가지 접근 방법 :

  • 는 데이터베이스의 이전 버전을 삭제합니다. 제거는이 작업을 수행하는 한 가지 방법입니다. 이 방법으로 데이터베이스는 현재 가지고있는 코드 (onCreate())로 생성됩니다. 이것은 종종 앱을 개발할 때 가장 간단한 방법입니다.

  • 전달할 데이터베이스 버전 번호를 SQLiteOpenHelper 수퍼 클래스로 올립니다. 이 번호가 데이터베이스 파일에 저장된 버전 번호와 다른 경우 onUpgrade() 또는 onDowngrade()이 호출되며 데이터베이스 스키마를 업데이트 할 수 있습니다. 이는 앱을 업데이트 할 때 사용자가 데이터를 보존 할 수 있도록 이미 버전을 출시 한 경우 선호되는 방법입니다.

1

데이터베이스가 열 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

은 먼저 해당 테이블을 생성 쿼리에 포함되지 않은 열 x 수 있지만 pPrice 열이있는 테이블 Books을 만들어

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

터미널

에서 데이터베이스를 삭제합니다. 나중에이 열 이름을 테이블 만들기 쿼리에 추가했습니다. 그것이이 문제가 발생한 이유입니다.

데이터베이스를 삭제하십시오. 응용 프로그램에서 이전 데이터베이스를 삭제하고 새 데이터베이스를 다시 시작할 때 생성됩니다. onCreate()은 데이터베이스가 존재하지 않는 경우에만 호출됩니다.

-1

일부 공간이 부족하지 않은지 확인하십시오. 나는 동일한 문제가 있었고 공간을 추가하여 해결했습니다 ...

관련 문제