Android sqlite insert返回错误

时间:2014-04-29 13:54:08

标签: android sqlite

我想创建一个简单的应用程序,允许用户通过单击按钮在数据库中添加传感器列表器返回的当前值, 所以我开始创建一个sqlite数据库(我第一次使用sqlite)。 我创建了所有必要的类(根据标准)。

这是我的代码:

* SSnsor.java类:

public class SSensor {

private int id;
private String Accx;
private String Accy;
private String Accz;
private String Gyrox;
private String Gyroy;
private String Gyroz;

public SSensor () {};

public SSensor(String Accx, String Accy,String Accz, String Gyrox,String Gyroy,    String Gyroz){
    this.Accx = Accx;
    this.Accy = Accy;
    this.Accz = Accz;
    this.Gyrox = Gyrox;
    this.Gyroy = Gyroy;
    this.Gyroz = Gyroz;
}

public int getId() {
    return id;
} 
public void setId(int id) {
    this.id = id;
}


public String getAccx() {
    return Accx;
}
public String getAccy() {
    return Accy;
}
public String getAccz() {
    return Accz;
}
public String getGyrox() {
    return Gyrox;
}
public String getGyroy() {
    return Gyroy;
}
public String getGyroz() {
    return Gyrox;
}


public void setGyrox(String Gyrox) {
    this.Gyrox = Gyrox;
}
public void setGyroy(String Gyroy) {
    this.Gyroy = Gyroz;
}
public void setGyroz(String Gyroz) {
    this.Gyroz = Gyroz;
}
public void setAccx(String Accx) {
    this.Accx = Accx;
}
public void setAccy(String Accy) {
    this.Accy = Accy;
}
public void setAccz(String Accz) {
    this.Accz = Accz;
} 
}

*允许创建和升级表的MaBaseSQLite类:

public class MaBaseSQLite extends SQLiteOpenHelper {

private static final String TABLE_SENSORS = "table_sensors";
private static final String COL_ID = "ID";
private static final String COL_AX = "AX";
private static final String COL_AY = "AY";
private static final String COL_AZ = "AZ";
private static final String COL_GX = "GX";
private static final String COL_GY = "GY";
private static final String COL_GZ = "GZ";

private static final String CREATE_BDD = "CREATE TABLE " + TABLE_SENSORS + " ("
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_AX + " TEXT NOT NULL, "
+ COL_AY + " TEXT NOT NULL, " + COL_AZ + " TEXT NOT NULL, " + COL_GX + " TEXT NOT   
    NULL, " + COL_GY + " TEXT NOT NULL, "+ COL_GZ + " TEXT NOT NULL);";

public MaBaseSQLite(Context context, String name, CursorFactory factory, int version) {
    super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_BDD);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_SENSORS + ";");
    onCreate(db);
} 
}

* SensorsBDD类(DAO类):

public class SensorsBDD {

private static final int VERSION_BDD = 1;
private static final String NOM_BDD = "senssor.db";

private static final String TABLE_SENSORS = "table_sensors";
private static final String COL_ID = "ID";
private static final int NUM_COL_ID = 0;
private static final String COL_AX = "AX";
private static final int NUM_COL_AX = 1;
private static final String COL_AY = "AY";
private static final int NUM_COL_AY = 2;
private static final String COL_AZ = "AZ";
private static final int NUM_COL_AZ = 3;
private static final String COL_GX = "GX";
private static final int NUM_COL_GX = 4;
private static final String COL_GY = "GY";
private static final int NUM_COL_GY = 5;
private static final String COL_GZ = "GZ";
private static final int NUM_COL_GZ = 6;


private SQLiteDatabase bdd;

private MaBaseSQLite maBaseSQLite;

public SensorsBDD(Context context){
    maBaseSQLite = new MaBaseSQLite(context, NOM_BDD, null, VERSION_BDD);
}

public void open(){
    bdd = maBaseSQLite.getWritableDatabase();
}

public void close(){
    bdd.close();
}

public SQLiteDatabase getBDD(){
    return bdd;
}

public long insertSensor(SSensor sensor){

    ContentValues values = new ContentValues();

    values.put(COL_ID, sensor.getId());
    values.put(COL_AX, sensor.getAccx());
    values.put(COL_AY, sensor.getAccy());
    values.put(COL_AZ, sensor.getAccz());
    values.put(COL_GX, sensor.getGyrox());
    values.put(COL_GY, sensor.getGyroy());
    values.put(COL_GZ, sensor.getGyroz());

    return bdd.insert(TABLE_SENSORS, null, values);
}
      }

*在我的活动课上,我所做的就是:

public class MainActivity extends ActionBarActivity {

SensorsBDD sensorBdd ;
SSensor s;
Button save=null;
long i;
String str;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    s = new SSensor ("a","b","c","d","e","f");//silly i know
    sensorBdd = new SensorsBDD(this);

        save = (Button) findViewById(R.id.bouton);

        save.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {

             i= sensorBdd.insertSensor(s);     
             str = String.valueOf(i);

          Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();

          }
        });
        }

@Override
  protected void onResume() {
    sensorBdd.open();
    super.onResume();
  }

  @Override
  protected void onPause() {
    sensorBdd.close();
    super.onPause();
  }
 }

第一次单击按钮时,toast显示0(新插入的行的行ID),然后每当我点击按钮时,toast显示-1,这意味着发生了错误。

如果我做了一个平庸的错误(我是一个机器人新手),请提前帮助并抱歉。

1 个答案:

答案 0 :(得分:0)

您反复插入相同的值。由于ID列为INTEGER PRIMARY KEY AUTOINCREMENT,因此尝试插入具有相同ID的行将失败。

删除

values.put(COL_ID, sensor.getId());

让数据库自动增量机制为您选择一个新的ID。