Как получить sqlite для сохранения строкового типа, когда он содержит только цифры? - PullRequest
1 голос
/ 13 октября 2019

Когда я создаю таблицу с полем STRING с помощью плагина nativescript-sqlite, и вводим строку «000123» (любая строка, содержащая только числа), а затем выводим запись из БД, он возвращает int (123)и не сохраняется тип строки. Есть ли какая-нибудь хитрость для этого? Я прилагаю код, который я использую для создания, сохранения и возврата поля ....

создание таблицы (код был сокращен)

 var Name = 'users';
 var TableDef = MedID INT, Naam STRING ,Pin STRING';
 db.execSQL("CREATE TABLE IF NOT EXISTS " + Name + 
 "(id INTEGER PRIMARY KEY         AUTOINCREMENT," + TableDef + " )")
 .then(result =>  {...} );         

Вставка записи

db.execSQL( "INSERT INTO users (MedID,Naam,Pin) VALUES (?, ?,?)",
 [1,'John Doe','000123'] )
 .then(id => {...} );

возврат пин-кода

var db_name = "scanapp.db";
new sqlite(db_name).then(db => 
{    
     db.all('select MedID, Naam, Pin from users order by ID ')
    .then (rows => { console.log (rows[0][2]); });
});

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Проблема в определении вашей таблицы. Вашему столбцу Pin был присвоен тип STRING.

. В Sqlite тип столбца используется для установки сходства этого столбца и управления предпочтительным способом хранения значений вэтот столбец. Если вы посмотрите на правила определения типа сходства на основе типа столбца , вы увидите, что для типа STRING по умолчанию установлено сходство NUMERIC, что означает:

Столбец со сходством NUMERIC может содержать значения, использующие все пять классов хранения. Когда текстовые данные вставляются в столбец NUMERIC, класс хранения текста преобразуется в INTEGER или REAL (в порядке предпочтения), если такое преобразование без потерь и обратимо.

Интересная вещь - это бит без потерь и обратимый , потому что это явно не благодаря тому, что ведущие нули обнуляются. Я подозреваю, что это ошибка.

В любом случае, исправление состоит в том, чтобы изменить определение таблицы, чтобы использовать типы, которые имеют TEXT сходство - например, TEXT, CHAR и т. Д. Вместо текущего STRING:

sqlite> create table foo(bar text, baz string);
sqlite> insert into foo values ('0012', '0012');
sqlite> select bar, typeof(bar), baz, typeof(baz) from foo;
bar         typeof(bar)  baz         typeof(baz)
----------  -----------  ----------  -----------
0012        text         12          integer
0 голосов
/ 13 октября 2019

Команда INSERT выполняется без каких-либо исключений? Я спрашиваю, потому что вы явно вставляете MedID, который является основным полем AUTOINCREMENT таблицы.

Ваш оператор INSERT должен выглядеть следующим образом:

db.execSQL("insert into users (Naam, Pin) values (?, ?)", ["John Doe", "000123"], function(err, id) {
  console.log("The new record id is:", id);
});

Всегда проверяйте err чтобы убедиться, что ваша команда успешно выполнена или нет.

if (err) {
      console.error("Failed to insert!", err);
    } else {
      console.log("The new record id is:", id);
    }

Пожалуйста, проверьте документацию NativeScript sqlite для более полезной информации.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...