有问题,不知道为什么..我没有NOT NULL列.. 因此,当我单击“添加”按钮时出现错误。
E/SQLiteDatabase(4585): Error inserting purchase_sum=12.49 purchase_name=testRecord
E/SQLiteDatabase(4585): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
E/SQLiteDatabase(4585): at android.database.sqlite.SQLiteStatement.native_executeInsert(Native Method)
E/SQLiteDatabase(4585): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:113)
E/SQLiteDatabase(4585): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718)
E/SQLiteDatabase(4585): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591)
E/SQLiteDatabase(4585): at com.antique.checkit.MainActivity.addRecord(MainActivity.java:66)
MainActivity.java:66
long rowId = db.insert("CheckDb", null, cv);
这是主要活动:
public class MainActivity extends Activity {
private static final int MENU_QUIT = 0;
final String LOG_TAG = "myLogs";
DBHelper dbHelber;
ContentValues cv;
SQLiteDatabase db;
TextView textCurrentBalance;
EditText editPurchaseName;
EditText editPurchaseSum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editPurchaseName = (EditText) findViewById(R.id.editPurchaseName);
editPurchaseSum = (EditText) findViewById(R.id.editPurchaseSum);
// DataBase
dbHelber = new DBHelper(this);
db = dbHelber.getWritableDatabase();
// get data to DataBase
cv = new ContentValues();
textCurrentBalance = (TextView) findViewById(R.id.textCurrentBalance);
textCurrentBalance.setText("99999.9 zł");
}
public void addRecord(View v){
// read values
String purchaseName = editPurchaseName.getText().toString().trim();
String purchaseSum = editPurchaseSum.getText().toString().trim();
// insert to map
cv.put("purchase_name", purchaseName);
cv.put("purchase_sum", purchaseSum);
// push to DataBase
long rowId = db.insert("CheckDb", null, cv);
Log.d(LOG_TAG, "row inserted, ID = " + rowId);
// read data from DataBase
if (rowId>=0) {
//String[] columns = {"purchase_name", "purchase_sum", "purchase_date"};
String[] columns = {"purchase_name", "purchase_sum"};
Cursor c = db.query("CheckDb", columns, null, null, null, null, null);
if (c.moveToFirst()) {
int pNameIndex = c.getColumnIndex("purchase_name");
int pSumIndex = c.getColumnIndex("purchase_sum");
do {
String pName = c.getString(pNameIndex);
Double pSum = c.getDouble(pSumIndex);
Log.d(LOG_TAG, "RECORDS: " + pName +"; " + pSum.toString());
}
while ( c.moveToNext() );
}
else {
Log.d(LOG_TAG, "NO RECORDS!");
}
c.close();
textCurrentBalance.setText("");
Toast.makeText(this, "Данные обновлены!", Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
menu.add(0, MENU_QUIT, 3, "exit");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
else if (id == MENU_QUIT) {
finish();
}
return super.onOptionsItemSelected(item);
}
}
数据库创建:
public class DBHelper extends SQLiteOpenHelper {
final String LOG_TAG = "myLogs";
public DBHelper(Context context) {
super(context, "checkDB", null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "Creating database...");
db.execSQL("CREATE TABLE CheckDb ("
+"purchase_id integer primary key autoincrement,"
+"purchase_name nvarchar,"
+"purchase_sum double"
+");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
谢谢!
答案 0 :(得分:0)
这可能是问题 - 您将 purchaseSum 声明为字符串。 purchaseSum应该有'double'数据类型
String purchaseName = editPurchaseName.getText().toString().trim();
String purchaseSum = editPurchaseSum.getText().toString().trim();//convert to double datatype
// insert to map
cv.put("purchase_name", purchaseName);
cv.put("purchase_sum", purchaseSum);//purchaseSum should have 'double' datatype
如果仍然导致问题,请将'purchase_name nvarchar'更改为'purchase_name text' - 只需试一试..