Обновление Swift 2 Есть новые отказоустойчивые инициализаторы, которые позволяют вам делать это более идиоматичным и безопасным способом (как было отмечено многими ответами, двойное значение NSString не очень безопасно, потому что оно возвращает 0 для значений без номера. Это означает, что doubleValue
из "foo"
и "0"
одинаковы.)
let myDouble = Double(myString)
Это возвращает необязательный параметр, поэтому в случаях, например, в "foo"
, где doubleValue
вернул 0, failable intializer вернет nil
. Вы можете использовать guard
, if-let
или map
для обработки Optional<Double>
Исходная запись: вам не нужно использовать конструктор NSString, как предлагает принятый ответ. Вы можете просто нарисовать его так:
(swiftString as NSString).doubleValue
Нашел проблему: Я пытался получить доступ к столбцам, которые не были добавлены в проекты в методе readNumber, и добавление этих проекций решило проблему.
readNumber
blockquote>public Cursor readNumber(SQLiteDatabase database) { String[] projections = { DbContract.ITEMID, DbContract.PHONE_NUMBER, DbContract.CALL_TYPE, DbContract.CALL_DATE, DbContract.CALL_DURATION}; return (database.query(DbContract.TABLE_NAME, projections, null, null, null, null, null)); }
В вашей проекции, созданной вызовом readNumber
, возвращаются только столбцы id
и PHONE_NUMBER
. Вероятно, DbContract.ITEMID
не равно id
, и при попытке поиска DbContract.ITEMID
в курсоре он не найден. Чтобы исправить это, вам нужно использовать метод ITEMID
в readNumber
, что-то вроде:
public Cursor readNumber(SQLiteDatabase database) {
String[] projections = {DbContract.ITEMID, DbContract.PHONE_NUMBER};
return (database.query(DbContract.TABLE_NAME, projections, null, null, null, null, null));
}
Другая проблема заключается в том, что вы пытаетесь получить доступ и к другим полям, например: CALL_TYPE
, CALL_DATE
и т. д.
Итак, чтобы решить проблему, вы также: