Я считаю, что у вас есть одна из двух проблем.
Потенциальная проблема 1.
Возможно, вы изменили структуру базы данных и просто перезапустили приложение.В этом случае новые столбцы (как пример) не будут существовать, и это может вызвать сбой (исключение SQlite).
Если вы выполните одно из следующих действий до перезапуска приложения, такая проблема будет исправлена: -
- Удалите (очистите) данные приложения.
- УдалитеПриложение.
- Увеличение версии базы данных ( например, изменение
super(context, DATABASE_NAME, null, 1);
на super(context, DATABASE_NAME, null, 2);
)
Потенциальная проблема 2.
Срок оплатыдля столбца invoice_id , определяемого как invoice_id INTEGER PRIMARY KEY
, значение должно быть целочисленным, поскольку INTEGER PRIMARY KEY делает столбец псевдонимом специального столбца rowid , который должен быть значением INTEGER ROWID и INTEGER PRIMARY KEY ( AUTOINCREMENT - это просто расширение, которое требует, чтобы следующее автоматически назначаемое значение было больше, чем любое значение, которое существует или существовало ).
invoice_id также должно быть уникальным значением.
Сказав это, ваш код работает по крайней мере в моде.Для проверки вашего кода использовалось следующее: -
activity_main.xml внесено незначительное изменение в Spinner, удалив android:entries="@array/Packages"
.- Это было удалено, чтобы упростить тестирование, а также потому, что membership.toString()
получит не значение выбранного элемента, а строковое представление объекта (см. Результат ниже) DatabaseManager.java согласно вопросу (т.е. нетизменения). MainActivity.java согласно: -
public class MainActivity extends AppCompatActivity {
DBHelper mDBHlpr;
DatabaseManager myDb;
EditText editInvoiceid, editName, editCreditCard, editRenewDate, editExpiryDate, edittotalamt;
Spinner membership;
TextView textViewViewPayments;
Button btnAddData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDb = new DatabaseManager (this);
//Cast variables over here.
editInvoiceid = (EditText) findViewById(R.id.editTextName1);
editName = (EditText) findViewById(R.id.editTextName);
editCreditCard = (EditText) findViewById(R.id.editTextName2);
editRenewDate = (EditText) findViewById(R.id.editTextName3);
editExpiryDate = (EditText) findViewById(R.id.editTextName4);
edittotalamt = (EditText) findViewById(R.id.editTextName5);
textViewViewPayments = (TextView) findViewById(R.id.textViewViewEmployees);
membership = (Spinner) findViewById(R.id.spinnerPackages);
btnAddData = (Button) findViewById(R.id.buttonAddPayment);
AddData();
}
//Create a method for adding data
public void AddData() {
btnAddData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean isInserted = myDb.insertData(editInvoiceid.getText().toString(), editName.getText().toString(),editCreditCard.getText().toString(),editRenewDate.getText().toString(), editExpiryDate.getText().toString(),edittotalamt.getText().toString(), membership.toString());
if (isInserted == true){
Toast.makeText(MainActivity.this, "Data Inserted",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(MainActivity.this, "Data Not Inserted",Toast.LENGTH_LONG).show();
}
logCurrentData(); //<<<<<<<<<< ADDED
}
});
}
/**
* ADDED METHOD
*/
private void logCurrentData() {
DatabaseUtils.dumpCursor(
myDb.getWritableDatabase().query(DatabaseManager.TABLE_NAME,null,null,null,null,null,null)
);
}
}
- т.е. добавлен метод logCurrentData , и он вызывается в onClick method.
Результаты
Тест 1 Ввод: -
![enter image description here](https://i.stack.imgur.com/cY2o5.png)
Результаты в (Тосты Вставленные данные ): -
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@6a5e922
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: 0 {
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: invoice_id=1
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: customer_name=Fred
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: credit_card=1234567890
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: renewal_date=10/19
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: expiry_date=10/19
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: membership=android.support.v7.widget.AppCompatSpinner{ec45337 V.ED..CL. ........ 0,320-1080,344 #7f07007c app:id/spinnerPackages}
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: total_amount=50.00
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: }
2018-12-31 21:45:40.282 2266-2266/so53976714.so53976714 I/System.out: <<<<<
- Примечание: членство в программе связано с memebership.toString (), как описано выше.
Тест 2 Измените Fred на Bert и попробуйте добавить: -
приводит к Данные не вставлены журнал включает следующее (а также точно такие же данные, как в предыдущем тесте): -
2018-12-31 21:50:14.115 2266-2266/so53976714.so53976714 E/SQLiteDatabase: Error inserting credit_card=1234567890 renewal_date=10/19 total_amount=50.00 expiry_date=10/19 invoice_id=1 customer_name=Bert membership=android.support.v7.widget.AppCompatSpinner{ec45337 V.ED..CL. ........ 0,320-1080,344 #7f07007c app:id/spinnerPackages}
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: Payment.invoice_id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
at so53976714.so53976714.DatabaseManager.insertData(DatabaseManager.java:47)
at so53976714.so53976714.MainActivity$1.onClick(MainActivity.java:45)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6680)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
- Примечание исключение было перехвачено и не вызывает сбоя.
- Как видно из значения invoice_id (в данном случае 1)) нельзя дублировать.
Тест 3 Попробуйте изменить invoice_id с 1 на A (все еще с Берт вместо Фреда): -
Результаты в Данные не вставлены .Однако журнал включает в себя: -
2018-12-31 21:54:51.818 2266-2266/so53976714.so53976714 E/SQLiteLog: (20) statement aborts at 5: [INSERT INTO Payment(credit_card,renewal_date,total_amount,expiry_date,invoice_id,customer_name,membership) VALUES (?,?,?,?,?,?,?)] datatype mismatch
2018-12-31 21:54:51.820 2266-2266/so53976714.so53976714 E/SQLiteDatabase: Error inserting credit_card=1234567890 renewal_date=10/19 total_amount=50.00 expiry_date=10/19 invoice_id=A customer_name=Bert membership=android.support.v7.widget.AppCompatSpinner{ec45337 V.ED..CL. ........ 0,320-1080,344 #7f07007c app:id/spinnerPackages}
android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20 SQLITE_MISMATCH)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
at so53976714.so53976714.DatabaseManager.insertData(DatabaseManager.java:47)
at so53976714.so53976714.MainActivity$1.onClick(MainActivity.java:45)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6680)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
- снова исключение перехватывается.
Test4 изменяет invoice_id на 2: -
Result Данные вставлены и журнал включает в себя: -
2018-12-31 22:10:32.902 2266-2266/so53976714.so53976714 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@4d18939
2018-12-31 22:10:32.905 2266-2266/so53976714.so53976714 I/System.out: 0 {
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: invoice_id=1
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: customer_name=Fred
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: credit_card=1234567890
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: renewal_date=10/19
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: expiry_date=10/19
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: membership=android.support.v7.widget.AppCompatSpinner{ec45337 V.ED..CL. ........ 0,320-1080,344 #7f07007c app:id/spinnerPackages}
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: total_amount=50.00
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: }
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: 1 {
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: invoice_id=2
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: customer_name=Bert
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: credit_card=1234567890
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: renewal_date=10/19
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: expiry_date=10/19
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: membership=android.support.v7.widget.AppCompatSpinner{ec45337 V.ED..CL. ........ 0,320-1080,344 #7f07007c app:id/spinnerPackages}
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: total_amount=50.00
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: }
2018-12-31 22:10:32.906 2266-2266/so53976714.so53976714 I/System.out: <<<<<