2011-11-09 27 views
8

Tôi cố gắng để lưu trữ một giá trị null vào cơ sở dữ liệu nhưng mỗi lần tôi nạp giá trị tôi nhận được 0.chèn null như giá trị Integer vào một cơ sở dữ liệu

Tôi tuyên bố lĩnh vực này giống như "intVal integer"

Đây là làm thế nào tôi lấy nó:?

Integer x; 

x = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X)); 

có phải đó là đáng tin cậy hoặc là nó không xác định

vì vậy, có vẻ như với tôi người ta không thể lưu null như một integervalue không xác định

Rất cám ơn

Trả lời

15

Từ the getInt() documentation:

Trả về giá trị của cột được yêu cầu như một int. Kết quả và liệu phương pháp này có ném ngoại lệ khi giá trị cột là null hay không, loại cột không phải là loại không thể tách rời hoặc giá trị số nguyên nằm ngoài phạm vi [Integer.MIN_VALUE, Integer.MAX_VALUE] được định nghĩa thực hiện.

Vì vậy, đó là chi tiết triển khai mà bạn không nên dựa vào.

Bạn vẫn có thể nhận được hiệu ứng mình muốn, mặc dù: bạn chỉ cần thực hiện kiểm tra trống trước khi bạn đọc giá trị.

int index = cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X); 
Integer x = null; 
if (!cursor.isNull(index) 
    x = cursor.getInt(index); 

// now x is either null or contains a valid value 
+0

cảm ơn rất nhiều ... – user387184

0

SQLite được nhập động. Vì bạn đã định nghĩa cột kiểu Integer và nó không tìm thấy một giá trị, nó trả về 0 dựa trên gợi ý.

Hãy thử sử dụng String như các loại cột

+2

Điều gì sẽ xảy ra nếu bạn muốn biết nếu trường được lưu trữ trống không? Làm thế nào để bạn biết sự khác biệt ở đây? – Stoff81

0

Như Rajdeep Dua đã đề cập, SQLite sử dụng một cách gõ động. Dưới đây là những gì các documentation nói:

Hầu hết các cơ sở dữ liệu SQL (SQL mỗi cơ sở dữ liệu khác hơn SQLite, như xa như chúng ta biết) sử dụng tĩnh, gõ cứng nhắc. Với cách nhập tĩnh , kiểu dữ liệu của một giá trị được xác định bởi vùng chứa - cột cụ thể trong đó giá trị được lưu trữ.

SQLite sử dụng hệ thống kiểu động tổng quát hơn. Trong SQLite, kiểu dữ liệu của một giá trị được liên kết với chính giá trị, chứ không phải với vùng chứa của nó.

Tài liệu Android cho biết kết quả của getInt() khi giá trị cột là null được xác định thực hiện. Đối với tôi, nó cũng trả về 0. Vì vậy, tôi đã sử dụng getString() thay vào đó, mặc dù kết quả của phương pháp này cũng được thực hiện xác định, đối với tôi, nó trả về null khi giá trị cột là null hoặc một chuỗi chứa số khác.

Vì vậy, các mã trông như thế này:

Strint strVal = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X)); 

if(strVal != null){ 
    int intVal = Integer.parseInt(strVal); 
} 
Các vấn đề liên quan