另一个android.database.sqlite.SQLiteConstraintException:错误代码19:约束失败

时间:2014-10-25 12:55:20

标签: java android sqlite

有问题,不知道为什么..我没有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

    }

}

谢谢!

1 个答案:

答案 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' - 只需试一试..

相关问题