android - 如果我没有在 SQL 表中设置 not null 语句,为什么我的应用程序会崩溃?
问题描述
我有这个代码:
{
String SQL_CREATE_BOOKS_TABLE = "CREATE TABLE " + BooksContract.BooksEntry.TABLE_NAME + " ("
+ BooksContract.BooksEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ BooksContract.BooksEntry.COLUMN_BOOKS_PRODUCT + " TEXT NOT NULL, "
+ BooksContract.BooksEntry.COLUMN_BOOKS_PRICE + " DECIMAL NOT NULL DEFAULT 0, "
+ BooksContract.BooksEntry.COLUMN_BOOKS_QUANTITY + " INTEGER NOT NULL, "
+ BooksContract.BooksEntry.COLUMN_BOOKS_SUPPLIER + " TEXT, "
+ BooksContract.BooksEntry.COLUMN_BOOKS_PHONE + " INTEGER );";
db.execSQL(SQL_CREATE_BOOKS_TABLE);
}
即使我没有将供应商设置为,如果我在单击保存按钮时not null
不输入它,我的应用程序就会崩溃。editText
此外,即使数量设置为默认 0,如果我不输入任何数量,它仍然会崩溃。为什么?
编辑活动:
private void insertBooks() {
String productString = productName.getText().toString().trim();
String priceString = price.getText().toString().trim();
int price = Integer.parseInt(priceString);
String quantityString = quantity.getText().toString().trim();
int quantity = Integer.parseInt(quantityString);
String supplierString = supplier.getText().toString().trim();
String phoneString = supplierPhone.getText().toString().trim();
int phone = Integer.parseInt(phoneString);
BooksDbHelper dbHelper = new BooksDbHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_PRODUCT, productString);
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_PRICE, priceString);
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_QUANTITY, quantityString);
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_SUPPLIER, supplierString);
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_PHONE, phoneString);
long newRowId = db.insert(BooksContract.BooksEntry.TABLE_NAME, null, values);
if (newRowId == -1) {
// If the row ID is -1, then there was an error with insertion.
Toast.makeText(this, "Error with saving book", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Book saved with row id: " + newRowId, Toast.LENGTH_SHORT).show();
}
}
目录活动:
private void insertBooks() {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_PRODUCT, "Walks with men");
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_PRICE, 10.00);
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_QUANTITY, 2);
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_SUPPLIER, "Amazon");
values.put(BooksContract.BooksEntry.COLUMN_BOOKS_PHONE, 727213658);
long newRowId = db.insert(BooksContract.BooksEntry.TABLE_NAME, null, values);
}
解决方案
在您的方法中使用此代码insertBooks()
以避免NumberFormatException
:
String productString = productName.getText().toString().trim();
String priceString = price.getText().toString().trim();
double price = 0.0;
try {
price = Double.parseDouble(priceString);
} catch (NumberFormatException e) {
e.printStackTrace();
}
String quantityString = quantity.getText().toString().trim();
int quantity = 0;
try {
quantity = Integer.parseInt(quantityString);
} catch (NumberFormatException e) {
e.printStackTrace();
}
String supplierString = supplier.getText().toString().trim();
String phoneString = supplierPhone.getText().toString().trim();
为什么电话是整数?
注意:
您发布的创建表代码可能是onCreate()
您的类中扩展的方法的一部分SQLiteOpenHelper
。
该onCreate()
方法在您第一次运行应用程序并创建表时执行。
从那时起,您可能已按类型或名称更改列,甚至插入或删除列,但所有这些更改仅在您的代码中进行,而不是在 table 中。onCreate() 方法再也没有被触发过。
因此,如果上述任何一项适用于您:
从模拟器/设备中卸载应用程序,以便删除数据库并再次运行您的应用程序以重新创建它。
推荐阅读
- pandas - 如何将新文件添加到数据框
- angular - 错误:ENOENT:在 Angular 中将文件扩展名从 .sass 更改为 .scss 后没有这样的文件或目录
- java - Azure-SQL:是否可以使用带有 TLS 1.2 的 jTDS 连接到 Azure SQL Server?
- visual-studio-code - 如何让我的 vscode 字体像 sublime 一样倾斜?
- haproxy - 如果存在具有值的标头,则路由到特定后端
- javascript - 每月供款的复利计算器
- java - 从java中的arraylist中删除对象
- c# - 测试用例在空断言上失败
- xaml - 使图像适合框架 XAML
- bash - 如何使用 bash 脚本递归地用另一个字符串替换一个字符串以在 xcode .pbxproj 文件中设置变量?