这是我的活动类。当我按下数据按钮时,数据应插入数据库。但每次“未插入”时都会出现
my = new DatabaseHandler(this);
data=(Button)findViewById(R.id.data);
data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
time=clockTimeTextView.getText().toString();
repeat=Repeat_optionTextview.getText().toString();
ringtone=Ringtone_optionTextview.getText().toString();
if(chkBox.isChecked()){
vibrate="true";
}else{
vibrate="false";
}
method=Method_optionTextview.getText().toString();
//Toast.makeText(getApplicationContext(),method + ringtone ,Toast.LENGTH_LONG).show();
boolean checkers = my.addtotable(et.getText().toString(),time,repeat,ringtone,vibrate,method);
if (checkers == true) {
Toast.makeText(AddAlarmActivity.this, "Successfully Inserted", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(AddAlarmActivity.this, "Not Inserted", Toast.LENGTH_LONG).show();
}
}
});
这是DatabaseHandler类
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHandler extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "database5.db";
private static final String TABLE_NAME = "mytable10";
private static final String COLUMN1 = "ID";
private static final String COLUMN2 = "TIME";
private static final String COLUMN3 = "REPEAT";
private static final String COLUMN4 = "RINGTONE";
private static final String COLUMN5 = "VIBRATE";
private static final String COLUMN6 = "METHOD";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, 2);
}
@Override
public void onCreate(SQLiteDatabase db) {
String query;
query = "CREATE TABLE " + TABLE_NAME + "(" + COLUMN1 + " INTEGER PRIMARY KEY , "
+ COLUMN2 + " TEXT , "
+ COLUMN3 + " TEXT , "
+ COLUMN4 + " TEXT , "
+ COLUMN5 + " TEXT , "
+ COLUMN6 + "TEXT " + ")";
db.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
public boolean addtotable(String id, String time, String repeat, String ringtone,String vibrate,String method) {
SQLiteDatabase sqLiteDatabase = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN1, id);
contentValues.put(COLUMN2, time);
contentValues.put(COLUMN3, repeat);
contentValues.put(COLUMN4, ringtone);
contentValues.put(COLUMN5, vibrate);
contentValues.put(COLUMN6, method);
long checker = sqLiteDatabase.insert(TABLE_NAME, null, contentValues);
if (checker == -1) {
return false;
} else {
return true;
}
}
public Cursor display() {
SQLiteDatabase sqLiteDatabase = getReadableDatabase();
Cursor res;
res = sqLiteDatabase.rawQuery("SELECT * FROM " + TABLE_NAME, null);
return res;
}
}
当我制作两个列(column_1& column_2)时,它工作正常。但是当我制作两个以上的列“未插入”消息时,我找不到错误的位置。请帮助
答案 0 :(得分:0)
猜测原因是传递给通过addtotable
检索的et.getText().toString()
方法的文本不是有效整数,因此根据以下内容失败了rowid值的特殊约束: - < / p>
在SQLite中,类型为INTEGER PRIMARY KEY的列是其中的别名 ROWID(除非在WITHOUT ROWID表中),它总是64位签名 整数。 SQLite Autoincrement
我建议最简单的解决方法是注释掉或删除该行: -
contentValues.put(COLUMN1, id);
另一种解决方案是确保从看似EditText的内容中检索的值是一个整数。但是我不认为这对用户界面有好处。
另一种方法是更改列,使其不是rowid的别名,可能通过将TEXT指定为列类型甚至是INT PRIMARY KEY(请注意,您必须删除表并重新定义它。增加数据库版本number应该这样做,或者你可以删除App的数据或卸载App,后两个删除数据库,因此运行onCreate方法。)
您应该查看id列的要求。通常,id列用于唯一标识行,如果对用户有任何价值,则通常很少。