首页 > 解决方案 > 如果我没有在 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);
}

标签: androidsqlite

解决方案


在您的方法中使用此代码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() 方法再也没有被触发过。
因此,如果上述任何一项适用于您:
从模拟器/设备中卸载应用程序,以便删除数据库并再次运行您的应用程序以重新创建它。


推荐阅读